Применяя Y-комбинатор к рекурсивной функции с двумя аргументами в Clojure?

StackOverflow https://stackoverflow.com/questions/3483077

Вопрос

Выполнение функции 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, здесь).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top