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