-1

我将如何使用大于或小于符号作为变量,以便当我输入时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 回答