将 Y-Combinator 应用于 Clojure 中带有两个参数的递归函数?
对单参数函数(例如 Clojure 中的阶乘或斐波那契)执行 Y 组合器已有详细记录: http://rosettacode.org/wiki/Y_combinator#Clojure
我的问题是 - 你好吗它对于两个参数的函数(例如这个 getter)?
(这里假设我想递归地解决这个问题,并且这个非惯用的 clojure 代码是出于另一个原因故意存在的)
[非 y-combinator 版本]
(defn get_ [n lat]
(cond
(empty? lat) ()
(= 0 (- n 1)) (first lat)
true (get_ (- n 1) (rest lat))))
(get_ 3 '(a b c d e f g h i j))
Doing the Y-Combinator for a single argument function such as factorial or fibonacci in Clojure is well documented:
http://rosettacode.org/wiki/Y_combinator#Clojure
My question is - how do you do it for a two argument function such as this getter for example?
(Assumption here is that I want to solve this problem recursively and this non-idiomatic clojure code is there deliberately for another reason)
[non y-combinator version]
(defn get_ [n lat]
(cond
(empty? lat) ()
(= 0 (- n 1)) (first lat)
true (get_ (- n 1) (rest lat))))
(get_ 3 '(a b c d e f g h i j))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于
args
已apply
'd,因此 args 的数量不会发生任何变化。你只需要改变get_
的结构:The number of args doesn't change anything since the
args
areapply
'd. You just need to change the structure ofget_
:这会很简单。
假设您有一个函数 H:
然后应用相同的 Y 组合器:
其中
4
和5
是您要传递给 H 的参数。组合器是本质上是“处理”H 中的顶级函数,而不是正在做艰苦工作的函数(这里是元数为 2 的函数)。
It'd be pretty straight forward.
Say you've got a function H:
Then you apply the same ol' Y-Combinator:
Where
4
and5
are arguments you want to pass to H.The combinator is essentially "dealing with" the top-level function in H, not the one that's doing the hard work (the one with arity 2, here).