views:

115

answers:

2

Doing the Y-Combinator for a single argument function such as factorial or fibonacci in Clojure is well documented: http://rosettacode.org/wiki/Y_combinator#Clojure

My question is - how do you do it for a two argument function such as this getter for example?

(Assumption here is that I want to solve this problem recursively and this non-idiomatic clojure code is there deliberately for another reason)

[non y-combinator version]

(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))
A: 

It'd be pretty straight forward.

Say you've got a function H:

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

Then you apply the same ol' Y-Combinator:

((Y H) 4 5)

Where 4 and 5 are arguments you want to pass to H.

The combinator is essentially "dealing with" the top-level function in H, not the one that's doing the hard work (the one with arity 2, here).

Isaac Hodes
+3  A: 
Alex Taggart