【发布时间】:2012-03-08 04:27:24
【问题描述】:
在此页面上有一个如何使用自定义排序对列表进行排序的示例: http://zvon.org/other/haskell/Outputlist/sortBy_f.html
xxx a b | odd a = LT
| otherwise = GT
Input: sortBy xxx [1,2,3,4,5,6,7]
Output: [1,3,5,7,6,4,2]
标准的小于顺序让我可以比较列表,例如
[1,2,3] < [0,4,5]
是假的。但这不适用于上面的示例函数:
Main> xxx [1,2,6] [1,7,3]
ERROR - Cannot infer instance
*** Instance : Integral [a]
*** Expression : xxx [1,2,6] [1,7,3]
有没有一种简单的方法可以将这种顺序扩展到列表?
我想要这个功能的原因是使用 sortBy 来使用我的自定义排序对列表进行排序。
如果您提供示例解决方案代码、关于阅读内容的建议或介于两者之间的任何内容,我将不胜感激。我希望有一些内置的方法可以用语言做到这一点,而不是编写一个直接比较列表的函数。
【问题讨论】:
-
请注意,
sortBy期望排序函数定义 total order,而xxx没有。例如,xxx y y应该为任何y返回EQ,如果xxx y z为某些y和z返回LT,那么xxx z y应该返回GT等等。