2

clojureの経験がまったくなく、大学時代から関数型プログラミングの練習がないので、サンプルコードを解釈してclojureの構文を理解しようとしています。

私はフィボナッチのいくつかのバージョン(https://gist.github.com/pcalcao/ea4176719d778ea3ab9e)をコーディングすることから始めましたが、それでも、より複雑な形式を完全に理解しているとは言えません。

たとえば、これは次のとおりです。

(defn fib_map [n]
  (last (take (+ n 1)
    (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))))   

私はこのコードの最も内側の部分を本当に理解するのに苦労しています:

fn [[a b]] [b (+ a b)] 

今、私の理解から、1つのパラメーター、2つの値を持つベクトル(これは破壊的ですよね?)を受け取り、別のベクトルを返す無名関数を作成しています。

さて、次の代わりにこれを行う理由は何ですか?

fn [a b] [b (+ a b)]

これらは同等ですか?それとも、無名関数がで使用する「ギミック」として単一のパラメーターを受け取るようにするだけiterateですか?

これが完全に明白であるならば申し訳ありませんが、私が言ったように、Lispのような言語はまだ私の強みではありません。

4

2 に答える 2

11

あなたはすでにそれを自分で正しく理解しています。

フォームの機能は、(fn [[a b]] ...)破壊を使用しています。これは、clojureのnth機能をサポートするベクトルまたは別のタイプのオブジェクトである必要がある単一のパラメーターを取ります。デストラクチャリングを使用して、最初の2つの値をベクトルから「プル」し、それらをローカル変数aとに割り当てますb

フォーム(fn [a b] ...)の機能は、2つのパラメーターの機能です。2つは同等ではありません。

(fn [[a b]] ...)でフォームを使用する必要がある理由は、単一パラメーター関数iterateでのみ機能するためです。iterate

于 2013-03-07T13:42:17.717 に答える
2

これは、 iterate が 2 つのパラメーター (つまり、1 つの関数と 1 つのパラメーター) しかとらないためです。参照。ドキュメント

于 2013-03-07T13:34:01.510 に答える