Haskell sortBy
函数需要 (a -> a -> Ordering)
作为它的第一个论点。谁能教育我那里的推理是什么?我的背景完全是具有类似功能的语言采取(a -> a -> Bool)
相反,因此必须编写一个返回 LT
/GT
有点困惑。
这是在静态类型/纯函数式语言中执行此操作的标准方式吗?这是 ML 后裔语言特有的吗?它是否有一些我没有看到的基本优势,或者使用 bool 值有一些隐藏的缺点?
总结:
Ordering
不是 GT | LT
,实际上是GT | EQ | LT
(显然 GHC
并没有在后台使用它来进行排序,但仍然)Ordering
而不是 Bool
将保存比较Ordering
更容易实现稳定的排序 Ordering
让读者清楚地知道正在对两个元素进行比较( bool 值本身并不具有这种含义,尽管我感觉许多读者会假设它)我暂时接受 Carl 的回答,并发布上述摘要,因为在本次编辑中没有一个单一的答案能够达到所有要点。
最佳答案
我认为 Boolean Blindness是主要原因。 Bool
是没有域语义的类型。它在像 sortBy
这样的函数的情况下的语义完全来自惯例,而不是来自函数正在运行的域。
这为编写比较函数所涉及的心理过程增加了一层间接性。而不是仅仅说“我可以返回的三个值小于、等于或大于”,排序的语义构建 block ,你说“我想返回小于,所以我必须将它转换为 bool 值”。总是存在一个额外的心理转换步骤。即使您精通约定,它仍然会减慢您的速度。如果你不熟悉约定,你会因为不得不检查它是什么而减慢了很多速度。
它是 3 值而不是 2 值的事实意味着您在排序实现中也不需要非常小心以获得稳定性 - 但这是一个次要的实现细节。它并不像让你的值(value)观真正有意义那么重要。 (另外,Bool
并不比 Ordering
更有效。它不是 Haskell 中的原语。它们都是库中定义的代数数据类型。)
关于sorting - 为什么 sortBy 不采用 (a -> a -> Bool)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12152561/