私は 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 に割り当てる方法です。
前もって感謝します!
私は 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 に割り当てる方法です。
前もって感謝します!
make-adder
1 つのパラメーター (z) を受け取る関数を返します。渡されたパラメーターはmake-adder
、値を y に割り当てるために使用されます。はパラメータ 2add2
で評価した結果と等しく設定されます。したがって、 は から返される関数と等しく設定されます。これは(y が のパラメータに割り当てられているため)次のようになります。make-adder
add2
make-adder
make-adder
(fn [z] (+ 2 z))
それで(add2 4)
、6に評価されるこの関数を呼び出します。それは役に立ちますか?
私には、あなたは興味深い問題に取り組んでいるようです。
例の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などになります。