gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:43:00 25 4
gpt4 key购买 nike

我是 Haskell 和函数式编程的新手。我正在阅读 Real World Haskell,我意识到我对一些例子感到困惑。

具体来说,这是在第 9 章的“用于谓词的领域特定语言”一节中,具有 w x y z 参数的示例。

我把它归结为:

为什么这段代码会编译?

f :: Int -> (Int -> Int)
f x y = x+y

main = do
let q = f 4 5
putStr (show (q))

根据类型签名, f显然接受 1 个参数并返回一个函数。
但是,似乎我可以编写函数方程,因此它将接受两个参数并返回一个 int。
为什么这可能?这是否意味着类型签名被忽略?

这是 curry 吗?这是某种封闭吗?
如果我理解 http://www.haskell.org/haskellwiki/Currying正确,那么它似乎与那里定义的柯里化(Currying)有点相反-我的 f函数采用多个参数而不是单个参数!

此外,任何人都可以回答请提供指向某种 Haskell 文档的链接,其中说明了这种能力(如果可能的话)。

编辑:

在考虑了一段时间之后,你们两个似乎暗示的是:

1) 这个语法是语法糖,f 永远只有一个参数,不管方程里写了多少个参数

2) 在应用 f 时,函数体将(总是?)被转换为一个 stub (实际上是返回的函数),其中 x 固定为给定的参数 (4),y 是一个参数。

3) 然后将这个新函数应用于替换 y 的 5,然后计算 + 函数。

我真正感兴趣的是,它到底在哪里说“在函数方程中,如果你写了多个参数,它真的是语法糖,并且实际上会发生以下情况......”正如我在上面写的那样。
或者这对除了我以外的所有人来说都那么明显吗?

编辑二:

真正令人大开眼界的答案在下面的@luqui 评论中,不幸的是,我认为我无法将评论标记为答案。

事实是
f x y = ...
实际上是语法糖:
f =\x ->\y -> ...

对我来说,下面每个人所说的其他一切都来自于此。

我在《Haskell 简介》中找到了一个相关的来源: http://haskell.cs.yale.edu/tutorial/functions.html在第 3.1 节中,称为 Lambda 抽象。

In fact, the equations:

inc x = x+1 add x y = x+y

are really shorthand for:

inc = \x -> x+1 add = \x y -> x+y



虽然它不使用短语“语法糖”,但它使用了更多,呃,数学导向的单词“速记”,但作为一名程序员,我将其读为“糖”:-)

最佳答案

这是 curry 。正如类型签名所说,f只接受一个参数。那将是 4 .然后它返回一个函数,该函数立即应用于 5 .实际上,这两种类型签名:
Int -> Int -> Int

Int -> (Int -> Int)
在 Haskell 中是等价的。

编辑:这个链接关于 Partial Application ,我在您提供的页面中找到,解释了这一点。

编辑 2:你问到 Haskell 的柯里化(Currying)行为是在哪里定义的。我不知道这是否是您要查找的内容:Haskell 98 Revised Report ,在 3.3 Curried Applications and Lambda Abstractions 部分中,说:

Function application is written e1 e2. Application associates to the left, so the parentheses may be omitted in (f x) y.

关于types - Haskell 中的类型签名与函数方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4768453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com