我是 Haskell 和函数式编程的新手。我正在阅读 Real World Haskell,我意识到我对一些例子感到困惑。
具体来说,这是在第 9 章的“用于谓词的领域特定语言”一节中,具有 wxyz 参数的示例。
我把它归结为:
为什么这段代码会编译?
f :: Int -> (Int -> Int)
f x y = x+y
main = do
let q = f 4 5
putStr (show (q))
根据类型签名,f
显然是接受 1 个参数并返回一个函数。但是,似乎我可以编写函数方程,因此它将接受两个参数并返回一个 int。为什么这可能?这是否意味着类型签名被忽略?
这是咖喱吗?这是某种封闭吗?如果我正确理解了这个http://www.haskell.org/haskellwiki/Currying,那么它似乎与那里定义的 currying 有点相反——我的f
函数采用多个参数而不是单个参数!
此外,任何人都可以回答请提供指向某种 Haskell 文档的链接,其中说明了这种能力(如果可能的话)。
编辑:
在考虑了一段时间之后,你们两个似乎暗示的是:
1) 这个语法是语法糖,f 永远只有一个参数,不管方程里写了多少个参数
2) 在应用 f 时,函数体将(总是?)被转换为一个存根(实际上是返回的函数),其中 x 固定为给定的参数 (4),y 是一个参数。
3) 然后将这个新函数应用于替换 y 的 5,然后计算 + 函数。
我真正感兴趣的是,它到底在哪里说“在函数方程中,如果你写了多个参数,它真的是语法糖,实际上会发生以下情况......”正如我在上面写的那样。或者这对除了我以外的所有人来说都那么明显吗?
编辑二:
真正令人大开眼界的答案在下面的@luqui 评论中,不幸的是,我认为我无法将评论标记为答案。
事实上 fxy = ... 实际上是语法糖: f = \x -> \y -> ...
对我来说,下面每个人所说的其他一切都来自于此。
我在 Haskell 的 Gentle Introduction to Haskell 中找到了一种来源:http: //haskell.cs.yale.edu/tutorial/functions.html在第 3.1 节中,称为 Lambda Abstractions。
事实上,方程:
公司 x = x+1 添加 xy = x+y
是真正的简写:
公司 = \x -> x+1 添加 = \xy -> x+y
虽然它不使用短语“语法糖”,但它使用了更多,呃,数学导向的单词“速记”,但作为一名程序员,我将其读为“糖”:-)