小编Or *_*hen的帖子

Haskell中的类型签名与函数方程

我是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 - > …

haskell types signature

12
推荐指数
1
解决办法
2036
查看次数

标签 统计

haskell ×1

signature ×1

types ×1