为什么sortBy如此奇怪地不受约束,为什么没有一般的排序

Ala*_*lan 1 sorting haskell

http://zvon.org/other/haskell/Outputlist/sortBy_f.html上的示例2 定义了比较函数xxx a b = if (odd a) then LT else GT.Haskell似乎对此作为比较函数感到满意,但在这种情况下我不理解"比较"的含义.什么是允许这样的东西的应用程序?(这里,2> 4和4> 2.)

作为参考,请考虑Python和Mathematica方法:列表基于单变量"键"函数进行排序,该函数将列表项映射到已订购的项.这看起来非常明智.(实际上,Python将类似Haskell的比较排序为多余的,并用排序键替换它们.)Haskell(显然)对此进行判断的基础是什么?是否有任何关于提供sortOn功能的讨论,以鼓励更"一致"(?)的"比较"概念.(我认识到一个"关键"函数可以用在比较函数中,或者使数据类型被排序为一个实例Ord,但这只是感觉不必要的尴尬和间接的东西这么简单.)

我错过了什么?这只是遗留问题,就像Python丢弃的那样,还是存在这种情况的数学动机?

编辑:如Nouri所述,Data.List.sortOn确实存在于列表中.这显然是在2014年增加的.

dfe*_*uer 6

sortBy基本上以相同的方式不受约束,并且基本上相同的原因,Ord实例通常是不受约束的.Haskell不依赖于键入.在Haskell中,你根本无法陈述或证明某个关系实际上是一个总排序.在像Agda这样的语言中,sortBy可以证明排序确实是一个,并产生证据,证明结果确实是输入的排序排列.这不容易!Python方法似乎失去了一些灵活性而没有获得任何保证,因此它不会像解决方案那样闻起来.

  • AFAIK之所以将Python转移到关键方法是效率.如果您能够将复杂对象映射到简单的键(如`int`s),那么O(nlog n)比较可以非常快速地完成.使用自定义比较功能可能需要进行O(n log n)代价高昂的比较.使用密钥只需要O(n)潜在的成本关键函数调用,最终使用O(n)额外空间(但通常有一个小常量) (2认同)