如何使用'(<)'作为变量?

时间:2013-04-24 01:59:39

标签: haskell

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

2 个答案:

答案 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)