-1

大なり小なり記号を変数として使用して、 or を入力すると、入力した記号に応じてリストを最高から最低、または最低から最高に並べ替えるにはどうすればよいMain> mySort (<) [1,5,3,6,4,1,3,3,2]ですMain> mySort (>) [1,5,3,6,4,1,3,3,2]か?

4

2 に答える 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 に答える