sorting - 为什么 sortBy 不采用 (a -> a -> Bool)?

标签 sorting haskell

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/

    相关文章:

    android - 如何让 JHC 与 android ndk 合作?

    java - 如何交换 map 中的 key ?

    haskell - 弱引用终结器保证运行

    haskell - 记录语法中具有大量构造函数的代数数据类型的替代方案

    sorting - Coq 中的排序列表

    Haskell:将偶数和奇数元素拆分为元组

    haskell - 如何升级gtk2hsC2hs?

    c# - 如何在 C# 中按升序对这些对象数组进行排序?

    java - 使用Coamparable接口(interface)在java中进行排序和二次排序

    javascript - JS : sort array by two fields