繁体   English   中英

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

[英]What does the type of “+” mean in Haskell

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

我的演讲幻灯片说

a -> a -> a

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

谢谢。

你必须掌握一些关卡:

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需要是一个实例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所以有不同的 +基于所使用的类型......而同样适用于数字文字像真正的01 ,...那就是为什么0可以是FloatInt或者是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个参数,谁的类型是abcd

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM