为列表等键入签名类型

mac*_*ian 5 haskell types type-signature

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

Ord a => ...

Eq a => ...

Num a => ...
Run Code Online (Sandbox Code Playgroud)

你能描述一下这些的含义,让我知道它们之间的区别(就我将如何向其他人解释)?

谢谢.

Tom*_*ett 13

这些都是"类约束"的示例:它们约束了可以使用哪些类型来代替它们之后的类型变量(a在本例中),要求它属于特定的类型类.Ord,EqNum的类型的类的实例.

  • Ord a => ...means a是一种具有与之相关的自然概念的类型.例如,整数可以自然地从较小到较大排列.在数学方面,存在一个总订单a.一个明显的例子是需要这种约束的函数sort :: Ord a => [a] -> [a]; 读这个签名说sort只会对可以相对于彼此排序的事物列表起作用.

  • Eq a => ...means a是一种类型,其成员可以相互比较,以获得一些相等的概念.在数学方面,存在一个等价关系a.请注意,这是一个超类Ord,意味着任何具有排序概念的东西也必须具有等价概念.需要此约束的函数的示例是elem :: Eq a => a -> [a] -> Bool(确定列表是否包含给定元素); 读这个签名说elem只会对可以相互比较的事物清单起作用.如果你想想你将如何写elem自己,这应该是有道理的.

  • Num a => ...装置a是一个数字类型,这意味着它支持一些基本算术运算:+,*,-,abs.我相信这大致类似于戒指的数学概念.基本上你认为"数字类型"的所有类型都属于这个类:Int,Double等等.Num a =>如果函数被编写为通常使用任何类型的数字,你会在签名前面看到约束.例如sum :: Num a => [a] -> a,它概括号码列表中的所有元素,可以同样出色的工作的[Int],[Double],[Rational],等等一切需要做的就是加起来的内容,不管他们是什么样的数字.但他们必须是数字!

基本上,这些类型类/约束是一种"原理重载"函数的方法.我们可以使用(==) :: Eq a => a -> a -> Bool各种类型,但不仅仅是任何类型.有些东西,例如函数,没有意义来比较相等性(可能因为相等不能对该类型进行判定),并且将两种不同类型的东西进行比较从来没有意义(与Java形成对比,其中你可以比较任何两个可能不同类型的对象是否相等).

为了进一步(非常容易)阅读类型类和约束,我强烈建议您学习一个Haskell.