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
你必须掌握一些关卡:
a -> b -> c
Run Code Online (Sandbox Code Playgroud)
是一个功能,一个一个a,一个b产生一个c
那还有更多:
a -> b -> c
Run Code Online (Sandbox Code Playgroud)
这是真的
a -> (b -> c)
Run Code Online (Sandbox Code Playgroud)
是一个函数取一个a并产生另一个函数,它取一个b并产生一个c
f :: (Num a) => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
添加约束a(此处Num- 这意味着a应该是一个数字 - a是Num类型类的实例)
所以你得到一个函数,它接受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)是不正常(+))你必须了解这里的最后一件事是,(+)被定义为的一部分,Num所以有不同的 +基础上,使用的类型......而同样如此数量的文字像0,1...这就是为什么0可以是一个Float或一个Int或任何类型的实例Num