2013-04-24 66 views
-1

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

+0

什么是使用**()**吗? – Martinsos 2013-04-24 02:02:15

+0

是要让它大胆 – user2313601 2013-04-24 02:04:13

+3

请参阅这里:http://stackoverflow.com/questions/16101710/sorting-in-haskell-with-parameter-using-higher-order-function(在你的班级有人?) – hammar 2013-04-24 02:05:30

回答

0

Data.List中已经有了一个函数,它和你想要的类似,它叫做sortBy
但是,如果你真的想实现它,你可以使用sortBy是这样的:(用ETA减少)

mySort cop ls = sortBy (\a b -> if (cop a b) then LT else GT) ls 

甚至:

mySort cop = sortBy (\a b -> if (cop a b) then LT else GT) 
+1

这是击败了具有更高阶次功能的整个点... – jozefg 2013-04-24 02:07:10

+0

@jozefg你能解释一下吗?你在谈论传递函数作为参数吗?我回答的问题只是要求< and >,所以我不认为有必要让它适用于各种功能。如果问题是创建一个接受比较函数作为操作符的排序,那么我同意这不是一个好主意。 – Martinsos 2013-04-24 02:11:03

+6

高阶函数可以让你一般地做这种事情,实际上做什么是取**函数**并使用它来产生排序,它的类型sig是'sortBy ::(a - > a - > Ordering) - > [a] - > [a]'这个重量更轻,更安全,使用你的方法你可以传入''*'或其他东西到你的函数中,并得到一个运行时错误,不知道它来自何处 – jozefg 2013-04-24 02:12:26

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 
+0

我觉得'wrap'的卫兵会更好,因为'| f a b = LT','| f b a = GT' then'|否则= EQ'。 – AndrewC 2013-04-24 21:10:12