Haskell中=>符号的含义是什么?
我是Haskell的新手,一般来说,函数式编程,我的语法有点不舒服。Haskell中=>符号的含义是什么?
在下面的代码=>
表示什么?还有(Num a, Ord a)
?
loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t
这是一个typeclass约束; (Num a, Ord a) => ...
表示loop
与a
一起使用,该类型是Num
和Ord
类型类别的实例,分别对应于数字类型和有序类型。基本上,您可以将loop
认为是=>
右侧的类型,但要求a
是Num
和Ord
的实例。
您可以将类型类视为基本上类似于OOP接口(但它们不是同一件事!) - 它们封装了任何实例必须支持的一组定义,并且可以使用这些定义来编写泛型代码。例如,Num
包括数字操作,如加法和乘法,而Ord
包括小于,大于等等。
有关特殊类的更多信息,请参阅Learn You a Haskell的this introduction。
论左侧=>
声明对于那些在右边使用的类型限制。
在您给出的示例中,这意味着a
被限制为Ord
类型类和Num
类型类的实例。
=>
分离型签名两个部分组成:
- 在左边,类型类的约束
- 在右侧,实际类型
所以,你能想到的(Num a, Ord a) => a -> (t -> t) -> t -> t
的意义“类型为a -> (t -> t) -> t -> t
,并且还必须有a
的Num
实例和a
的Ord
实例“。
更多关于类型类看去想它是Ord a
和Num a
额外的输入功能http://www.learnyouahaskell.com/types-and-typeclasses
的一种方式。它们是一种特殊的输入:字典。当您使用特定类型a
的此功能时,还必须有字典可用于类型a
的Ord
和Num
操作。
任何使用字典输入功能的函数也必须具有相同的字典输入。
foo :: (Num a, Ord a) => a -> t
foo x = loop x someFunc someT
但是,您不必显式传递这些字典。假设有一本可用的字典,Haskell会为你处理这件事。您可以创建一个类型实例的字典。
instance Num MyType with
x + y = ...
x - y = ...
...
这产生上MyType
字典用于Num
操作,因此MyType
可以在任何地方使用的Num a
是必需的输入(假设它满足其它要求,当然)。
值得澄清的是,虽然我们称之为“词典”,但它们并不是哈希表,而是函数的记录。它们有点像面向对象语言中的v-表格,只是它们没有附加到值。 – hammar 2012-02-04 22:19:28