大なり小なり記号を変数として使用して、 or を入力すると、入力した記号に応じてリストを最高から最低、または最低から最高に並べ替えるにはどうすればよいMain> mySort (<) [1,5,3,6,4,1,3,3,2]
ですMain> mySort (>) [1,5,3,6,4,1,3,3,2]
か?
質問する
197 次
2 に答える
4
渡し(<)
て各値を比較するだけです。
類似の機能
mySort :: (a -> a -> Ordering) -- Comparator function
-> [a]
-> [a]
そして、Haskell は非常に賢いので、これは既に として存在していsortBy
ます。Ordering
これにより、を返す関数を渡すことができます。
data Ordering = LT | EQ | GT deriving(...)
ただし、関数a -> a -> Bool
があるため、これを順序付けする必要があり、それを で使用できますsortBy
。
wrap f a b | not $ f a b || f b a = EQ
| f a b = LT
| otherwise = GT
これを使用してラップ(<)
し(>)
、持ち上げて使用できますsortBy
mySort :: (a -> a -> Bool) -> [a] -> [a]
mySort = sortBy . wrap
于 2013-04-24T02:34:25.533 に答える
0
Data.List には、必要なものと非常によく似た機能が既にあり、sortByと呼ばれます。
ただし、本当に実装したい場合は、次のように sortBy を使用できます。
mySort cop ls = sortBy (\a b -> if (cop a b) then LT else GT) ls
またはさらに短い (eta リダクションを使用):
mySort cop = sortBy (\a b -> if (cop a b) then LT else GT)
于 2013-04-24T02:05:19.443 に答える