将 Y-Combinator 应用于 Clojure 中带有两个参数的递归函数?

发布于 2024-09-14 07:33:43 字数 497 浏览 6 评论 0原文

对单参数函数(例如 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

那一片橙海, 2024-09-21 07:33:43

由于 argsapply'd,因此 args 的数量不会发生任何变化。你只需要改变get_的结构:

(defn get_ [f]
  (fn [n lat]
    (cond
      (empty? lat) ()
      (= 1 n) (first lat)
      :else (f (dec n) (next lat)))))

(defn Y [f]
  ((fn [x] (x x))
   (fn [x]
     (f (fn [& args]
          (apply (x x) args))))))
user=> ((Y getf) 3 '(a b c d e f g h i j))
c

The number of args doesn't change anything since the args are apply'd. You just need to change the structure of get_:

(defn get_ [f]
  (fn [n lat]
    (cond
      (empty? lat) ()
      (= 1 n) (first lat)
      :else (f (dec n) (next lat)))))

(defn Y [f]
  ((fn [x] (x x))
   (fn [x]
     (f (fn [& args]
          (apply (x x) args))))))
user=> ((Y getf) 3 '(a b c d e f g h i j))
c
猫烠⑼条掵仅有一顆心 2024-09-21 07:33:43

这会很简单。

假设您有一个函数 H:

(def H
  (fn [x] 
        (fn [x y]
              (stuff happens))))

然后应用相同的 Y 组合器:

((Y H) 4 5)

其中 45 是您要传递给 H 的参数。

组合器是本质上是“处理”H 中的顶级函数,而不是正在做艰苦工作的函数(这里是元数为 2 的函数)。

It'd be pretty straight forward.

Say you've got a function H:

(def H
  (fn [x] 
        (fn [x y]
              (stuff happens))))

Then you apply the same ol' Y-Combinator:

((Y H) 4 5)

Where 4 and 5 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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文