Haskell中“+”的类型是什么意思

时间:2014-08-28 08:02:49

标签: haskell

Prelude> :t (+)
(+) :: (Num a) => a -> a -> a

我的演讲幻灯片说明了

a -> a -> a

表示函数接受两个参数并返回一个,并且所有参数都是相同的类型。哪两个是参数,哪一个是返回值?

谢谢。

3 个答案:

答案 0 :(得分:13)

您必须掌握一些级别:

等级0

a -> b -> c

是一个函数,其中一个a和一个b生成一个c

1级

还有更多内容:

a -> b -> c

真的是

a -> (b -> c)

是一个函数,只需一个a并生成另一个函数,该函数需要b并生成c

2级

f :: (Num a) => a -> a -> a

a添加约束(此处Num - 这意味着a应为数字 - aNum类型的实例 - 类)

所以你得到一个函数,它接受a并产生一个函数,它接受另一个a并返回a,而a需要是{的实例{1}}

所以Num的每个输入都必须是相同类型的数字:

  • f没问题
  • f 1 2 不正常
  • f 'a' 'b'没问题
  • f (1::Int) (2::Int)没问题
  • f (1::Float) (2::Float) 不正常

3级(了解f (1::Int) (2::Float)

此处您必须了解的最后一点是,(+)被定义为(+)的一部分,因此基于使用的不同 Num类型......对于+0等数字文字也是如此......这就是为什么1可以是0或{{1}或者是Float

的实例的任何类型

答案 1 :(得分:1)

前两个是参数,最后一个是返回值。

事实上,由于currying,它可以这样读:+函数(只接受数值)接受参数a返回函数它接受相同类型的参数并返回相同类型的结果。

这是一个人为的例子:

let addTwo = (+) 2 -- the + function takes one argument and returns a function
addTwo 3 -- we can add the second argument here and obtain 5 as returned value

答案 2 :(得分:1)

假设我们有这样的类型:

a -> b -> c -> d -> e

序列中的 last 事物是返回类型。所以这个函数返回e类型的东西。其他一切都是参数类型。所以这个函数有4个参数,谁的类型是abcd

小写字母表示“类型变量” - 可以代表任何类型的变量。 (它不必是单个字母,但通常是。)任何以大写字母开头的东西都是特定类型,而不是变量。 (例如,Int是一种类型,int是一种类型变量。)

Num a部分表示a代表任何类型,但该类型必须实现Num类型类。其他常见上下文是Eq(定义{{​​1}}运算符),==(定义{{​​1}},Ord等等)和<(定义将东西转换为字符串的>函数。)