5

在 Clojure 中为单个参数函数(例如阶乘或斐波那契)执行 Y-Combinator 有据可查: http ://rosettacode.org/wiki/Y_combinator#Clojure

我的问题是 - 例如,对于诸如这个 getter 之类的两个参数函数,您如何做到这一点?

(这里的假设是我想递归地解决这个问题,而这个非惯用的 clojure 代码是出于另一个原因而故意存在的)

[非 y 组合器版本]

(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))
4

2 回答 2

4

args自从are apply'd以来,args 的数量不会改变任何东西。您只需要更改以下结构get_

(定义 get_ [f]
  (fn [n 纬度]
    (条件
      (空?纬度)()
      (= 1 n) (第一纬度)
      :else (f (dec n) (next lat)))))

(定义 Y [f]
  ((fn [x] (xx))
   (fn [x]
     (f (fn [& 参数]
          (应用 (xx) args))))))
用户=> ((Y getf) 3 '(abcdefghij))
C
于 2010-08-14T21:26:57.080 回答
2

这会很简单。

假设你有一个函数 H:

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

然后你应用相同的 ol' Y-Combinator:

((Y H) 4 5)

您要传递给 H 的参数在哪里4和是。5

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

于 2010-08-14T16:48:10.340 回答