我是Haskell的初学者,并且Haskell中的函数def存在问题。 值是Haskell中的函数,对吧? (+3)3 = 6但是(+3)(+ 3)是什么意思。 (+3)是否算作值?
答案 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
。两种类型具有不同的最外层构造函数就足以将它们视为不同。