我是Haskell和函数式编程的新手.我正在阅读真实世界的Haskell,我意识到我被一些例子搞糊涂了.
具体来说,这可以在第9章"谓词的域特定语言"一节中,这些示例包含wxyz参数.
我把它归结为:
为什么这段代码会编译?
f :: Int -> (Int -> Int)
f x y = x+y
main = do
let q = f 4 5
putStr (show (q))
Run Code Online (Sandbox Code Playgroud)
根据类型签名,f显然接受1个参数并返回一个函数.但是,似乎我可以编写函数方程,因此它将接受两个参数并返回一个int.为什么这可能?这是否意味着忽略了类型签名?
这是在讨好吗?这是某种封闭吗?如果我理解这个http://www.haskell.org/haskellwiki/Currying正确,那么它似乎与那里定义的currying相反 - 我的f函数是采用多个参数而不是单个参数!
此外,任何人都可以回答请提供一些链接到某种Haskell文档,其中说明了这种能力(如果可能的话).
编辑:
在考虑了一段时间之后,你们两个似乎暗示的是:
1)这种语法是语法糖,无论在等式中写入多少参数,f都将始终具有单个参数
2)在应用f时,函数体将(总是?)转换为存根(实际上是返回的函数),其中x固定为给定的参数(4),y是参数.
3)然后将这个新函数应用于5替换y,然后评估+函数.
我真正感兴趣的是,正如我在上面写的那样,它究竟在哪里说"在函数方程式中,如果你写了多个参数,它真的是语法糖,以及实际发生的......".或者除了我以外,每个人都这么明显吗?
编辑二:
真正令人大开眼界的答案在下面的@luqui评论中,不幸的是我认为我不能将评论标记为答案.
事实上,fxy = ...实际上是语法糖:f =\x - >\y - > ...
对我来说,下面所有其他人都说过这一点.
我在Haskell的Gentle Introduction中找到了一个这样的源代码,这里有:3.1节中的http://haskell.cs.yale.edu/tutorial/functions.html,名为Lambda Abstractions.
事实上,方程式:
inc x = x + 1 add xy = x + y
真的是简写:
inc =\x - > …