5

私は Clojure について少し調べようとしていますが、次の基本的な例でレンガの壁にぶつかりました。

(defn make-adder [x]
  (let [y x]
    (fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6

私が理解していないのはadd2、数値 4 を make-adder 関数に渡す方法と、その関数がその数値を z に割り当てる方法です。

前もって感謝します!

4

2 に答える 2

7

make-adder1 つのパラメーター (z) を受け取る関数を返します。渡されたパラメーターはmake-adder、値を y に割り当てるために使用されます。はパラメータ 2add2で評価した結果と等しく設定されます。したがって、 は から返される関数と等しく設定されます。これは(y が のパラメータに割り当てられているため)次のようになります。make-adderadd2make-addermake-adder

(fn [z] (+ 2 z))

それで(add2 4)、6に評価されるこの関数を呼び出します。それは役に立ちますか?

于 2012-05-23T13:13:10.177 に答える
3

私には、あなたは興味深い問題に取り組んでいるようです。

例のmake-adder関数(letバインディングなしで書き直されました)

(defn make-adder [x]
  "Returns a function that returns the sum of x and yet to be supplied z."
  (fn [z] (+ z x))))

xとzを合計する関数を返します。ここで、make-adderはすでに値を使用して呼び出されている必要があります。あなたの例はClojure部分関数を実装していると思います。これはかなりクールです。

これは、2つのパラメーターを合計し、関数を返さないように書き直されたmake-adder関数です(add2でpartialを使用できます)。

(defn make-adder
  "Returns sum of x and y." 
  [x y] 
  (+ x y))

これは、xパラメーターとして2を使用してpartialを使用して書き直されたadd2です。

(def add2 (partial make-adder 2))

(add2 2)答えを4と呼ぶと(add2 3)、答えは5などになります。

于 2012-05-23T14:51:44.317 に答える