Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
我的演讲幻灯片说明了
a -> a -> a
表示函数接受两个参数并返回一个,并且所有参数都是相同的类型。哪两个是参数,哪一个是返回值?
谢谢。
答案 0 :(得分:13)
您必须掌握一些级别:
a -> b -> c
是一个函数,其中一个a
和一个b
生成一个c
还有更多内容:
a -> b -> c
真的是
a -> (b -> c)
是一个函数,只需一个a
并生成另一个函数,该函数需要b
并生成c
f :: (Num a) => a -> a -> a
向a
添加约束(此处Num
- 这意味着a
应为数字 - a
是Num
类型的实例 - 类)
所以你得到一个函数,它接受a
并产生一个函数,它接受另一个a
并返回a
,而a
需要是{的实例{1}}
所以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
或{{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个参数,谁的类型是a
,b
,c
和d
。
小写字母表示“类型变量” - 可以代表任何类型的变量。 (它不必是单个字母,但通常是。)任何以大写字母开头的东西都是特定类型,而不是变量。 (例如,Int
是一种类型,int
是一种类型变量。)
Num a
部分表示a
代表任何类型,但该类型必须实现Num
类型类。其他常见上下文是Eq
(定义{{1}}运算符),==
(定义{{1}},Ord
等等)和<
(定义将东西转换为字符串的>
函数。)