4

私は Programming Clojure 2nd edition を読んでいて、49 ページでは Clojure の for ループ構造について説明していますが、これは実際にはシーケンス内包表記であると書かれています。

著者は、次のコードを提案しています。

(defn indexed [coll] (map-indexed vector coll))

(defn index-filter [pred col]
  (when pred
    (for [[idx elt] (indexed col) :when (pred elt)] idx)))

(index-filter #{\a} "aba")
(0 2)

...Java ベースの命令型の例よりも望ましいものであり、与えられた証拠は、「高階関数を使用することにより...機能的な index-of-any は、変数の必要性をすべて回避する」ことです。

変数でない場合、「idx」、「elt」とは何ですか? アキュムレータ以外の変数を意味しますか?

また、なぜ「a」ではなく #{\a} なのですか?

4

2 に答える 2

5

pred関数です-#{\a}文字 a を含むセットです。\aClojure では、セットは引数が含まれている場合に true を返す関数です。#(= % \a)またはを使用することもできます(fn [x] (= \a x))

他の答えが示すように、「この例を作成する際に状態は作成されませんでした」。 idx変数のようにelt機能しますが、シーケンス内包表記に対してのみローカルであるforため、コードはよりコンパクトで、ステートフルではなく、間違いなく明確です (シーケンス内包表記に慣れたら、少なくとも :-) ) -- おそらくテキストはそうではありませんこの点で最適にクリアします。

于 2012-09-26T15:59:07.860 に答える
4
  1. 関数型言語には変数がありません。実際には、 variablevalueを区別する必要があります。idxこれは具体的な値にバインドされた単なる名前であり、再割り当てすることはできません (ただし、別の値に再バインドすることはできます)。

  2. 関数の最初のパラメーターindex-filterは述語です。つまり、trueまたはを返す関数を意味しますfalse#{\a}これはデータ構造setですが、関数のように扱うこともできます。要素を set 関数の引数として渡すと、要素が存在する場合はこの引数 ( trueなど) を返し、それ以外の場合は nil ( falseなど) を返します。したがって、この set 述語は、よりわかりやすい方法で記述された無名関数と考えることができます。#(contains? #{\a} %)

于 2012-09-26T15:55:17.253 に答える