Haskell中"+"的类型是什么意思

use*_*256 2 haskell

Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

我的演讲幻灯片说

a -> a -> a
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Car*_*ten 13

你必须掌握一些关卡:

0级

a -> b -> c
Run Code Online (Sandbox Code Playgroud)

是一个功能,一个一个a,一个b产生一个c

1级

那还有更多:

a -> b -> c
Run Code Online (Sandbox Code Playgroud)

这是真的

a -> (b -> c)
Run Code Online (Sandbox Code Playgroud)

是一个函数取一个a并产生另一个函数,它取一个b并产生一个c

2级

f :: (Num a) => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

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

所以你得到一个函数,它接受a并产生一个函数,它接受另一个a并返回一个a,并且a需要是一个实例Num

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

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

3级(理解(+))

你必须了解这里的最后一件事是,(+)被定义为的一部分,Num所以有不同的 +基础上,使用的类型......而同样如此数量的文字像0,1...这就是为什么0可以是一个Float或一个Int或任何类型的实例Num