对单个参数函数进行Y-Combinator(例如,在Clojure中的阶乘或斐波那契)进行了充分记录: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))
有帮助吗?

解决方案

ARG的数量不会改变任何内容,因为 argsapplyd。您只需要更改 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

其他提示

这很简单。

说您有一个功能H:

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

然后,您应用相同的OL'Y-Combinator:

((Y H) 4 5)

在哪里 45 是您要传递给H.的论点。

组合者本质上是在“处理” H中的顶级功能,而不是在做艰苦的工作(在此处使用Arity 2)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top