gpt4 book ai didi

lambda-calculus - 访问 block 和 Y 组合器内的外部变量

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

我希望你们一切都好。我正在实现定点 Y 组合器 在海港,我遇到了一些麻烦。嗯,Y 组合器可以通过 lambda 演算定义为:
Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x)))
我正在尝试通过性能问题应用 Y-combinator 的内存。我目前的实现是:

Function YMem( bF, aCache )
Local xAnswer
If !lCache ; lCache := { } ; EndIf
Return { |Arg| Iif( aCache[ Arg ] ;
, /* then */ aCache[ Arg ];
, /* otherwise */ aCache[ Arg ] := ;
Eval( Eval( bF, { |N| Eval( Eval( YMem, bF, aCache ), N ) } ), Arg ) ) }

基本上,我不能在 block 内使用语句,但我可以使用表达式,它工作得很好。我正在避免无限递归和从 0 到无限的限制。

直到这个时候,它编译得很好,但是当我试图访问一个外部 block 的变量时,Harbor 把我踢到了脸上!

为了测试 Y 组合器的实现,我尝试应用斐波那契序列的简单实现,但是当我返回一个接收参数 G 的 block 时并隐式返回一个接收参数 N 的 block , G对我来说变得不可用,编译器告诉我“外部代码块变量遥不可及”。
Function Main
Local bFib := YMem( { |G| ;
{ |N| ;
Iif( N == 0, 1, Iif( N == 1, 1, Eval( G, N - 1 ) + Eval( G, N - 2) ) );
} ;
} )
Return

这也可以让我 curry block 。我的问题是:如何在 Harbour 中访问 block 内的外部变量?

最佳答案

在 Harbour、Clipper 和基于 xBase 的编程语言中, block 永远不能引用
到父 block 的变量。 block 不是闭包。我们可以通过
创建本地存储并在内部 block 中使用它们:

Function TestOuterScope
Local accA
Local bAdd := { |A| accA := A, { |B| accA + B } }
Return Eval( Eval( bAdd, 10 ), 20 )

关于lambda-calculus - 访问 block 和 Y 组合器内的外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29082774/

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