为列表等键入签名类型

时间:2011-06-15 03:42:23

标签: haskell types type-signature

您将如何用英语定义以下类型签名:

Ord a => ...

Eq a => ...

Num a => ...

你能描述一下这些的含义,让我知道这些差异是什么(就如何向其他人解释)?

感谢。

1 个答案:

答案 0 :(得分:13)

这些都是“类约束”的例子:它们约束了可以使用哪些类型代替它们之后的类型变量(在这种情况下为a),要求它属于特定的{{3 }}。 OrdEqNum是类型类的示例。

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

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

  • Num a => ...表示a是一种数字类型,这意味着它支持一些基本的算术运算:+*-,{{ 1}}。我相信这与equivalence relation的数学概念大致相似。基本上您认为“数字类型”的所有类型都属于此类:absInt等。如果函数是函数,您会在签名前面看到Double约束写作工作通常与任何类型的数字。例如,Num a =>可以对sum :: Num a => [a] -> a[Int][Double]等等的所有元素进行求和。要做的就是加上它的内容,无论它们是什么类型的数字。但他们必须是数字!

基本上,这些类型类/约束是一种“原理重载”函数的方法。我们可以在各种类型上使用[Rational],但不仅仅是任何类型。有些东西,例如函数,没有意义来比较相等(可能是因为对于那种类型不能判断相等),并且从不比较不同的两个东西是有意义的等式的类型(与Java形成对比,您可以在其中比较可能不同类型的任何两个对象的相等性。)

对于类型类和约束的进一步(非常容易阅读)阅读,我强烈推荐ring