[英]What does the type of “+” mean in Haskell
Prelude> :t (+)
(+) :: (Num a) => a -> a -> a
我的演讲幻灯片说
a -> a -> a
表示函数接受两个参数并返回一个,并且它们都是相同的类型。 哪两个是参数,哪一个是返回值?
谢谢。
你必须掌握一些关卡:
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
需要是一个实例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
实例的任何类型
前两个是参数,最后一个是返回值。
事实上,由于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
假设我们有这样的类型:
a -> b -> c -> d -> e
序列中的最后一件事是返回类型。 所以这个函数返回e
类型的东西。 其他一切都是参数类型。 所以这个函数有4个参数,谁的类型是a
, b
, c
和d
。
小写字母表示“类型变量” - 可以代表任何类型的变量。 (它不必是单个字母,但通常是。)任何以大写字母开头的东西都是特定类型,而不是变量。 (例如, Int
是一个类型, int
是一个类型变量。)
Num a
part表示a
代表任何类型,但该类型必须实现Num
类型。 其他常见的上下文是Eq
(定义==
运算符), Ord
(定义<
, >
等)和Show
(定义将函数转换为字符串的show
函数)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.