【问题标题】:Why aren't Nums Ords in Haskell?为什么 Haskell 中没有 Nums Ords?
【发布时间】:2013-02-04 16:05:32
【问题描述】:

我知道,对于具有 Num 类型类的实例的类型,必须有一个来自 EqShow 的实例

class (Eq a, Show a) => Num a

我想知道为什么它必须是 Eq 而不是 Ord。数字类型在Eq 中但不在Ord 中是否有意义?

【问题讨论】:

    标签: haskell typeclass


    【解决方案1】:

    例如,复数可以进行加法、减法、乘法和相等性检验,但不能排序。请参阅基础中 Data.Complex 中的Complex a

    【讨论】:

    • 可以对复数进行排序(例如,字典顺序既是部分的又是全部的)。请注意,这不是一个特别有用的排序(并且它们不允许排序,这使得它们成为有序字段)。
    • @cmh 我会说这是一个非常有用的排序,因为它使Set.fromList [1 :+ 1] 工作,以及Map.fromList [(1 :+ 1, 1)] 工作。我还要说它对于搜索值很有用,因为排序很容易搜索(对于人类和计算机(二进制搜索))。
    • @semicolon 同意,它确实有一些有用的计算价值。我想当我写这篇评论时,我的意思是从数学家的角度来看它并不是特别有用,尽管它是 3 年前的!
    【解决方案2】:

    请注意,EqShow 约束也被广泛认为是错误功能。例如,对于包含函数的事物,它们会阻止 Num 的完全有效实例。在最新版本的 GHC 中,这些约束也被删除,Num 完全没有超类约束。

    【讨论】:

    • 我们应该有一个实例Num b => Num (a -> b)。在数学中,我们在 Haskell 中编写的函数 const 2 几乎总是被称为 2,而且在支持适当重载的语言中,我们历史上没有将数字类型提升为函数是很愚蠢的。数字层次结构仍然被破坏,因为Num 仍然很大。 (我希望标准有 AdditiveMonoidAdditiveGroupAdditionCommutesRing 等类)
    • 对于那些还没有发现 sclv 含义的人,想想liftA2 (+) 做了什么......
    • @leftaroundabout 是的,更多的程序会无意中键入 check,但不会更多。通常你会得到错误最终出现。
    • @sclv 我认为它不应该被提升到任何应用函子,首先是因为 Haskell 的类型类系统仍然会阻塞这样的事情,其次是因为某些应用程序可能具有替代的数字结构。请参阅我对stackoverflow.com/questions/14641864/… 的回答,了解一个很酷但可能无用的示例
    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2016-04-16
    • 2012-10-14
    • 2022-11-23
    • 2011-06-03
    • 2014-12-25
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多