问题标签 [y-combinator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 递归函数的高阶函数?
有没有办法通过高阶函数“包装”递归函数,以便递归调用也被包装?(例如,在每次调用时记录函数的参数。)
例如,假设我们有一个函数 ,sum()
它通过将头部添加到尾部的总和来返回数字列表的总和:
有没有办法编写一个高阶函数,logging()
它将sum()
函数作为输入,并返回一个函数,该函数sum()
在每次递归调用时输出参数?
以下不起作用:
实际输出:
预期输出:
sum()
如果被重写以便它可以与 Y Combinator 风格的“递归”一起使用,这甚至可能吗?
javascript - javascript 和 elixir 中的 Y-combinator 实现
我一直在研究 Y Combinator,我知道它是如何在纸上工作的,但我还不知道如何用编程语言来实现它。
根据此页面: http: //matt.might.net/articles/implementation-of-recursive-fixed-point-y-combinator-in-javascript-for-memoization/
Y 组合子的推导如下:
他怎么能扩展Y(F)
成λ x.(Y(F))(x)
?他如何使用 U Combinator?
这是 Javascript 和 Elixir 中的实现:
如果这是公式:Y = \f.(\x.f(x x))(\x.f(x x))
,那么 lambda 表达式中的 f, x 与上述实现中的 f, x, y 之间的关系是什么?x 看起来是同一个 x,f 看起来是同一个 f。那是什么y
?具体来说,为什么 lambda 等效于x x
被包装在使用的函数中y
?
y
有点像函数的参数!?
swift - YCombinator 在 Swift 中不工作
我正在尝试创建一个 lambda 函数来获取阶乘函数,但这会引发分段错误和错误。我如何让这个在 Swift 中工作。请查看此视频以了解我正在尝试做的事情http://www.confreaks.com/videos/1287-rubyconf2012-y-not-adventures-in-functional-programming
clojure - Why does the y-combinator provide Turing equivalence?
This answer says
Here is a basic y-combinator in lambda calculus:
Y f = (\x -> f (x x)) (\x -> f (x x))
Ie Something like this in Clojure:
Here is another expression of the y-Combinator (step 2 of the argument)
We have encoded a Turing complete language (since we used the y-Combinator) (step 3 of the argument)
My question is: Why does the y-combinator provide Turing equivalence? It seems it was just an assumption of the argument.
lambda-calculus - 访问块和 Y 组合器内的外部变量
我希望你们一切都好。我正在 Harbor 中实现定点Y 组合器,但遇到了一些麻烦。嗯,Y 组合器可以通过lambda 演算定义为:
Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x)))
我正在尝试通过性能问题应用 Y-combinator 的记忆。我目前的实现是:
基本上,我不能在块内使用语句,但我可以使用表达式,它工作得很好。我正在避免无限递归和从 0 到无限的限制。
直到这个时候,它编译得很好,但是当我试图访问一个外部块的变量时,Harbor 把我踢到了脸上!
为了测试 Y 组合器的实现,我尝试应用斐波那契序列的简单实现,但是当我返回一个接收参数G
的块并隐式返回一个接收参数的块时,对我N
来说G
变得不可用并且编译器告诉我“外部代码块变量遥不可及”。
这也可以让我咖喱块。我的问题是:如何在 Harbour 中访问块内的外部变量?
recursion - Little Schemer:编写只支持长度≤2的列表的函数
在The little schemer一书中,我们发现这个函数只支持长度小于或等于1的列表:
我想逐步学习,并想编写仅支持长度小于或等于2的列表的类似函数。
请不要通过提供如下代码来回答这个问题:
因为这个函数支持任意长度。
而且我已经知道如何编写这样的函数:
实现我的目标。但是这段代码距离第一个代码片段不止一步。
也许,我不应该改变:
objective-c-blocks - 当我在 C 中使用 Y-Combinator 并阻塞时,我在参数值中遇到了一个奇怪的事情
当我尝试使用函数计算 sinh−1(x) 时:
它似乎有效。但是当我尝试使用 block 和 Y-Combinator 来做到这一点时:
但它在输出中的工作很奇怪(x = 0.5):
似乎在块中,有时,当我通过 buf=0.479167 时,下次打印它时,它仍然是 0.500000。我想找出它为什么会这样工作,也许我在某个地方写了一些错误的代码......
c# - 在 C# 中使用 Y 组合器
我试图弄清楚如何在一行中编写递归函数(例如阶乘,尽管我的函数要复杂得多)。为此,我想到了使用Lambda Calculus 的 Y 组合器。
这是第一个定义:
这是简化的定义:
我试图像这样用 C# 编写它们:
(Lambda
是一个Func<dynamic, dynamic>
。我第一次尝试用 typedef 它using
,但是没有用,所以现在用 定义delegate dynamic Lambda(dynamic arg);
)
我的阶乘 lambda 看起来像这样(改编自此处):
我这样称呼它:
但是,在这两种情况下(Y 组合器的原始形式和简化形式),我都会遇到堆栈溢出异常。根据我使用简化形式的推测,似乎它只是最终调用Y(factorial(Y(factorial(Y(factorial(...
并且从未最终实际进入阶乘 lambda。
因为我没有太多调试 C# lambda 表达式的经验,我当然也不太了解 lambda 演算,所以我真的不知道发生了什么或如何修复它。
万一这很重要,这个问题的灵感来自于尝试为这个问题写一个单行答案万一这很重要,这个问题的灵感来自于尝试用 C#
我的解决方案如下:
我的目标是写成getPermutations
一个单行自递归 lambda,这样我就可以将它插入到SelectMany
inAllSubstrings
并制作一个单行AllSubstrings
.
我的问题如下:
- 在 C# 中是否可以使用 Y 组合器?如果是这样,我在实施中做错了什么?
- 如果 Y 组合器在 C# 中是可能的,我将如何使我对子字符串问题(
AllSubstrings
函数)的解决方案单行? - 在 C# 中是否不可能使用 Y 组合器,是否还有其他允许单线的编程方法
AllSubstrings
?