gpt4 book ai didi

haskell - Haskell 中的柯里化(Currying)如何与 lambda 一起使用?

转载 作者:行者123 更新时间:2023-12-02 11:58:05 25 4
gpt4 key购买 nike

只是看看学习 Haskell(伟大的工作)并在 curried functions 部分下有一个例子说以下两个函数是相同的:

addThree x y z = x + y + z  
addThree = \x -> \y -> \z -> x + y + z

这里让我困惑的是柯里化(Currying)是如何应用于 lambda 的。函数的类型为

addThree :: (Num a) => a -> a -> a -> a  

使用 lambda 时,函数是否等于 \x -> (\y -> (\z -> x + y + z)) ?如果是这种情况,那么 x + y 是否被视为最内层 lambda 中的常量?也就是说,\z -> c + z,其中 cx + y

最佳答案

当读取像 addThree :: Num a => a -> a -> a -> a 这样的类型签名时您应该在心里添加适当的括号作为箭头右关联

addThree :: Num a => a ->  a ->  a -> a
addThree :: Num a => a -> (a -> (a -> a))

这也许有助于描述单参数 lambda 如何足以表示这样的函数。

当谈论柯里化(Currying) lambda 表达式时,您可以从几个方向来看待事物。例如,让我们检查一下内部片段

\z -> x + y + z

如果这就是给你的全部信息并要求你解释它,你将不得不沮丧地举起双手——根本没有定义x。和y应该是指。它们被称为“自由”变量,因为它们不受 lambda 约束。

为了给它们定义,我们必须包装更多的 lambda,将含义绑定(bind)到 xy .

\x -> \y ->     \z -> x + y + z       -- ok!

因此,从内到外看,如果没有这些外部 lambda,表达式就毫无意义。

但是,当您开始计算应用程序下的表达式时

(\x -> \y -> \z -> x + y + z) 1 2 3

然后一个不同的故事出现了。现在,您必须完全独立处理每个 lambda 绑定(bind)。规则是,为了评估应用于某个值的 lambda,您可以用绑定(bind)变量替换该值内部的任何位置。

(\x -> \y -> \z -> x + y + z) 1 2
( \y -> \z -> 1 + y + z) 2
( \z -> 1 + 2 + z)

因此,从外部看,表达式 \z -> x + y + z永远不存在,xy在我们到达这一步之前就被淘汰了。

但是值得注意的是,这与 c + z 并不完全相同仍然!在绑定(bind)第三个参数之前,我们不会评估内部 lambda 的主体。从某种意义上说,除非我们给它一些值,否则我们无法知道 lambda 里面有什么。 (\z -> 1 + 2 + z)是完全不透明的。只有应用了最终参数后,我们才能开始计算体内的添加。

总的来说,这就是所谓的“在 Binder 下”工作的困难。

关于haskell - Haskell 中的柯里化(Currying)如何与 lambda 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20791008/

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