【问题标题】:Type signature types for lists, etc键入列表等的签名类型
【发布时间】:2011-06-15 03:42:23
【问题描述】:

你会如何用简单的英语定义以下类型签名:

Ord a => ...

Eq a => ...

Num a => ...

您能否描述这些含义并告诉我它们的区别是什么(就我如何向其他人解释而言)?

谢谢。

【问题讨论】:

    标签: haskell types type-signature


    【解决方案1】:

    这些都是“类约束”的示例:它们限制可以使用哪些类型来代替它们后面的类型变量(在这种情况下为a),要求它属于特定的type classOrdEqNum 是类型类的示例。

    • Ord a => ... 表示a 是一种具有与之相关联的自然顺序概念的类型。例如,整数可以自然地从小到大排列。在数学术语中,a 上存在一个total order。需要此约束的函数的一个明显示例是sort :: Ord a => [a] -> [a];阅读此签名是说sort 仅适用于可以相对于彼此按顺序排列的事物列表。

    • Eq a => ... 表示a 是一种类型,其成员可以相互比较以获得某种相等概念。用数学术语来说,a 上存在一个equivalence relation。请注意,这是Ord 的超类,这意味着任何具有排序概念的东西也必须具有等价概念。需要此约束的函数示例是elem :: Eq a => a -> [a] -> Bool(确定列表是否包含给定元素);阅读此签名时说elem 仅适用于可以相互比较以获得相等性的事物列表。如果您考虑如何自己写elem,那应该是有道理的。

    • Num a => ... 表示a 是数字类型,意味着它支持一些基本的算术运算:+*-abs。我相信这与ring 的数学概念大致相似。基本上所有你认为是“数字类型”的类型都属于这个类:IntDouble 等。如果函数被编写为与任何类型通用地工作,你会在签名前面看到Num a => 约束一种数字。例如,sum :: Num a => [a] -> a,它对数字列表的所有元素求和,可以在 [Int][Double][Rational] 等上同样工作......它所要做的就是将其内容相加,不管他们是什么数字。但他们必须是数字!

    基本上,这些类型类/约束是一种“原则性重载”函数的方法。我们可以在各种类型上使用(==) :: Eq a => a -> a -> Bool,但不仅仅是任何类型。有些东西,例如函数,比较相等是没有意义的(也许是因为该类型不能确定相等),并且 永远 比较两个不同的东西是没有意义的 相等类型(与 Java 相比,您可以比较任何两个可能不同类型的对象的相等性)。

    要进一步(非常容易地)阅读类型类和约束,我强烈推荐Learn You a Haskell

    【讨论】:

    • 我认为人们经常期望(==) 是同余关系而不是等价关系。当然,Haskell 也不强迫你去做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多