Haskell中=>符号的含义是什么?

问题描述:

我是Haskell的新手,一般来说,函数式编程,我的语法有点不舒服。Haskell中=>符号的含义是什么?

在下面的代码=>表示什么?还有(Num a, Ord a)

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t 

这是一个typeclass约束; (Num a, Ord a) => ...表示loopa一起使用,该类型是NumOrd类型类别的实例,分别对应于数字类型和有序类型。基本上,您可以将loop认为是=>右侧的类型,但要求aNumOrd的实例。

您可以将类型类视为基本上类似于OOP接口(但它们不是同一件事!) - 它们封装了任何实例必须支持的一组定义,并且可以使用这些定义来编写泛型代码。例如,Num包括数字操作,如加法和乘法,而Ord包括小于,大于等等。

有关特殊类的更多信息,请参阅Learn You a Haskellthis introduction

论左侧=>声明对于那些在右边使用的类型限制。

在您给出的示例中,这意味着a被限制为Ord类型类和Num类型类的实例。

=>分离型签名两个部分组成:

  • 在左边,类型类的约束
  • 在右侧,实际类型

所以,你能想到的(Num a, Ord a) => a -> (t -> t) -> t -> t的意义“类型为a -> (t -> t) -> t -> t,并且还必须有aNum实例和aOrd实例“。

更多关于类型类看去想它是Ord aNum a额外的输入功能http://www.learnyouahaskell.com/types-and-typeclasses

的一种方式。它们是一种特殊的输入:字典。当您使用特定类型a的此功能时,还必须有字典可用于类型aOrdNum操作。

任何使用字典输入功能的函数也必须具有相同的字典输入。

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是必需的输入(假设它满足其它要求,当然)。

+1

值得澄清的是,虽然我们称之为“词典”,但它们并不是哈希表,而是函数的记录。它们有点像面向对象语言中的v-表格,只是它们没有附加到值。 – hammar 2012-02-04 22:19:28