mac*_*ian 5 haskell types type-signature
您将如何用英语定义以下类型签名:
Ord a => ...
Eq a => ...
Num a => ...
Run Code Online (Sandbox Code Playgroud)
你能描述一下这些的含义,让我知道它们之间的区别(就我将如何向其他人解释)?
谢谢.
Tom*_*ett 13
这些都是"类约束"的示例:它们约束了可以使用哪些类型来代替它们之后的类型变量(a
在本例中),要求它属于特定的类型类.Ord
,Eq
和Num
的类型的类的实例.
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.