gpt4 book ai didi

haskell - 在 Haskell 中去掉 let

转载 作者:行者123 更新时间:2023-12-04 02:36:51 24 4
gpt4 key购买 nike

我可能应该首先提到我对 Haskell 很陌生。是否有特殊原因保留 let Haskell 中的表达式?

我知道 Haskell 摆脱了 rec对应于 let 的 Y 组合器部分的关键字表明它是递归的语句。他们为什么不摆脱 let完全声明?

如果他们这样做了,那么语句在某种程度上似乎会更具迭代性。例如,类似:

let y = 1+2
z = 4+6
in y+z

只是:
y = 1+2
z = 4+6
y+z

对于刚接触函数式编程的人来说,这更具可读性和更容易理解。我能想到保留它的唯一原因是这样的:
aaa = let y = 1+2
z = 4+6
in y+z

如果没有 let ,我认为这最终是模棱两可的语法:
aaa = 
y = 1+2
z = 4+6
y+z

但是如果 Haskell 不忽略空格,并且代码块/范围的工作方式类似于 Python,它是否能够删除 let ?

是否有更强有力的理由保留 let ?

对不起,如果这个问题看起来很愚蠢,我只是想更多地了解它为什么在那里。

最佳答案

从句法上讲,你可以很容易地想象一种没有 let 的语言。 .立即,我们可以通过简单地依靠 where 在 Haskell 中生成它。如果我们想要的话。除此之外还有许多可能的语法。

从语义上讲,你可能认为 let 可以翻译成这样的东西

let x = e in g      ==>    (\x -> g) e

事实上,在运行时这两个表达式是相同的(模递归绑定(bind),但可以使用 fix 来实现)。然而,传统上, let具有特殊的类型语义(以及 where 和顶级名称定义......所有这些实际上都是 let 的语法糖)。

特别是,在构成 Haskell 基础的 Hindley-Milner 类型系统中,有一个 let 的概念。 -概括。直观地说,它考虑了我们将函数升级到其最多态形式的情况。特别是,如果我们有一个函数出现在某处的表达式中,其类型为
a -> b -> c

那些变量, a , b , 和 c , 在该表达式中可能已经或可能没有含义。特别是,它们被假定为固定但未知的类型。将其与类型进行比较
forall a b c. a -> b -> c

其中包括多态性的概念,即立即声明,即使碰巧有类型变量 a , b , 和 c在环境中可用,这些引用是新鲜的。

这是 HM 推理算法中非常重要的一步,因为它是生成多态性的方式,允许 HM 达到其更一般的类型。不幸的是,我们不可能随时执行此步骤——它必须在受控点执行。

这就是 let -generalization 确实如此:它表示当类型为 let 时应将其泛化为多态类型。 -绑定(bind)到特定名称。当它们仅作为参数传递给函数时,不会发生这种概括。

因此,最终,您需要一种“让”形式来运行 HM 推理算法。此外,尽管它们具有等效的运行时特性,但它不能只是函数应用程序的语法糖。

从语法上讲,这个“let”概念可能被称为 letwhere或通过顶级名称绑定(bind)的约定(所有这三个都在 Haskell 中可用)。只要它存在并且是在人们期望多态性的地方生成绑定(bind)名称的主要方法,那么它就会有正确的行为。

关于haskell - 在 Haskell 中去掉 let,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452343/

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