gpt4 book ai didi

Haskell - Lambda 演算等效语法?

转载 作者:行者123 更新时间:2023-12-04 16:26:02 30 4
gpt4 key购买 nike

在 Haskell 中编写一些 lambda 函数时,我最初编写的函数如下:

tru = \t f -> t
fls = \t f -> f

然而,我很快从网上的例子中注意到,这些函数经常写成这样:
tru = \t -> \f -> t
fls = \t -> \f -> f

具体来说,传递给函数的每个项目都有自己的 \->与上述相反。在检查这些类型时,它们似乎是相同的。我的问题是,它们是等效的还是实际上在某些方面有所不同?不仅对这两个功能,而且对一般功能有影响吗?非常感谢!

最佳答案

它们是一样的,Haskell 自动 curries保持事物语法良好的事物。以下都是等价的**

foo a b = (a, b)
foo a = \b -> (a, b)
foo = \a b -> (a, b)
foo = \a -> \b -> (a, b)
-- Or we can simply eta convert leaving
foo = (,)

如果您想成为惯用语,请选择第一个或最后一个。引入不必要的 lambda 对教授柯里化(Currying)很有好处,但在实际代码中只会增加语法困惑。

然而,在原始 lambda 演算(不是 Haskell)中,大多数手动使用
\a -> \b -> a b

因为人们不会手工编写很多 lambda 演算,而且当他们这样做时,他们倾向于坚持不加糖的 lambda 演算以使事情变得简单。

** 以单态限制为模,无论如何它都不会影响您的类型签名。

关于Haskell - Lambda 演算等效语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205404/

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