Haskell:函数和值

时间:2015-05-14 17:01:22

标签: haskell

我是Haskell的初学者,并且Haskell中的函数def存在问题。 值是Haskell中的函数,对吧? (+3)3 = 6但是(+3)(+ 3)是什么意思。 (+3)是否算作值?

2 个答案:

答案 0 :(得分:3)

(+3)不是你可能认为的那样。在其他语言中,这意味着数值 positive-three 。在Haskell中,它是+运算符的部分应用,并且是一个带有一个参数的函数(另一个要添加的数字)。它给它增加了三个。因此(+3) x是将函数(+3)应用于值x并返回x+3。但是,(+3) (+3)会尝试将3添加到函数 (+3),这样做没有意义并且会出现类型错误。

可能有助于想象用名为+的常规函数​​替换plus

plus x y = y + x

然后,(+3)相当于plus 3(+3) 3相当于(plus 3) 3,与plus 3 3相同。但是,(+3) (+3)相当于(plus 3) (plus 3)plus 3 (plus 3),这是没有意义的。

您可能想要考虑(+3) . (+3)的含义。这将两个添加三个的应用程序链接在一起,并且是一个单参数函数,它增加了六个。

答案 1 :(得分:1)

(+3) (+3)只是一个类型错误,因此无法编译。

(+3)的类型为Int -> Int,这意味着在应用Int时,我们会获得另一个Int。这也意味着您只能应用Int类型的值!

因此,您无法向(+3)申请Int -> Int类型的值,只能应用Int类型的值。

所以是的,(+3)是值,但不适合将类型应用于期望值为Int的函数的类型。

Int无法与Int -> Int统一,因为它们具有不同的类型构造函数,这使它们成为不同的类型,正如@DanielWagner所指出的那样。 Int -> Int的最外层构造函数是->,而Int的最外层构造函数只是Int。两种类型具有不同的最外层构造函数就足以将它们视为不同。