将Y-Combinator应用于递归功能,并在Clojure中有两个参数?
-
28-09-2019 - |
题
对单个参数函数进行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的数量不会改变任何内容,因为 args
是 apply
d。您只需要更改 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)
在哪里 4
和 5
是您要传递给H.的论点。
组合者本质上是在“处理” H中的顶级功能,而不是在做艰苦的工作(在此处使用Arity 2)。
不隶属于 StackOverflow