Применяя Y-комбинатор к рекурсивной функции с двумя аргументами в Clojure?
-
28-09-2019 - |
Вопрос
Выполнение функции y-комбинатора для одной функции аргумента, таких как факториал или фибоначчи в Clojure, хорошо документирован:http://rosettacode.org/wiki/y_combinator#Clojure.
Мой вопрос - как вы это делаете для двух аргументов, например, для этой добычи?
(Предположение Вот что я хочу решить эту проблему рекурсивно, и этот неидиоматический код 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))
Решение
Количество args ничего не меняет с момента args
находятся apply
д. Вам просто нужно изменить структуру get_
:
(defn get_ [f] (fn [n lat] (cond (пустой? lat) () (= 1 n) (первые lat): else (f (dep n) (следующий lat))))) (defn y [ f] ((fn [x] (xx)) (fn [x] (f (fn [& args] (apply (xx) args)))))))
user => ((y getf) 3 '(abcdefghij)) c
Другие советы
Было бы довольно прямо вперед.
Скажем, у вас есть функция h:
(def H
(fn [x]
(fn [x y]
(stuff happens))))
Затем вы применяете один и тот же OL 'Y-комбинатор:
((Y H) 4 5)
Где 4
и 5
Являются ли аргументы, которые вы хотите перейти к H.
Комбинатор по сути «занимается» функцией верхнего уровня в H, а не то, что делает тяжелую работу (то, что с ARITY 2, здесь).