您将如何用英语定义以下类型签名:
Ord a => ...
Eq a => ...
Num a => ...
你能描述一下这些的含义,让我知道这些差异是什么(就如何向其他人解释)?
感谢。
答案 0 :(得分:13)
这些都是“类约束”的例子:它们约束了可以使用哪些类型代替它们之后的类型变量(在这种情况下为a
),要求它属于特定的{{3 }}。 Ord
,Eq
和Num
是类型类的示例。
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的数学概念大致相似。基本上您认为“数字类型”的所有类型都属于此类:abs
,Int
等。如果函数是函数,您会在签名前面看到Double
约束写作工作通常与任何类型的数字。例如,Num a =>
可以对sum :: Num a => [a] -> a
,[Int]
,[Double]
等等的所有元素进行求和。要做的就是加上它的内容,无论它们是什么类型的数字。但他们必须是数字!
基本上,这些类型类/约束是一种“原理重载”函数的方法。我们可以在各种类型上使用[Rational]
,但不仅仅是任何类型。有些东西,例如函数,没有意义来比较相等(可能是因为对于那种类型不能判断相等),并且从不比较不同的两个东西是有意义的等式的类型(与Java形成对比,您可以在其中比较可能不同类型的任何两个对象的相等性。)
对于类型类和约束的进一步(非常容易阅读)阅读,我强烈推荐ring。