如何使用大于或小于符号作为变量,以便在我输入Main> mySort (<) [1,5,3,6,4,1,3,3,2]
或Main> mySort (>) [1,5,3,6,4,1,3,3,2]
时,它会根据哪个符号I将列表从最高到最低或从最低到最高排序选择进入?
答案 0 :(得分: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
答案 1 :(得分: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)