論文Essenceofthe IteratorPatternに関するEricTorreborreのブログ投稿で、彼はトラバースのデカルト積がトラバースでもあることを説明しています。
私には理解できないので、誰かがscalazライブラリを使用してこの例を見せてもらえますか?List[Int]
問題は、私が次の両方を提供したいということだとしましょう。
- リスト内の要素の
Int
合計 - その要素は、 sの
List[String]
文字列表現に「Z」を追加することによって作成されますInt
私の理解では、これを使用してこれを行うことができますtraverse
が、このソリューションとは異なり、実際に構造を1回だけトラバースするような方法で行うことができます。
val xs = List(1, 2, 3, 4)
val (sum, strings) = (xs.sum, xs map (_.toString + "Z"))
注1-これを行うには他の方法があり、この例ではトラバースする必要はなく、トラバースは必ずしもそれを解決するための最も明確な方法でもありません。しかし、私はトラバースを理解しようとしているので、述べられているように質問に対する答えを本当に探しています
編集-を使用してこれを行う方法を示してくれた以下のmissingfaktorState
に感謝します。私が知りたいのは、2つの独立した計算をどのように構成できるかということだと思います。例えば; 私の関数は概念的に次のとおりです。
val shape = (_ : List[Int]) map (_.toString + "Z")
val accum = (_ : List[Int]).sum
これらの蓄積メカニズムを互いに独立させてから、どちらかまたは両方List[Int]
を使用してトラバースするかどうかを選択したいと思います。私はこのようなコードを想像しました:
xs traverse shape //A List[String]
xs traverse accum //An Int
xs traverse (shape <x> accum) //The pair (List[String], Int)
エリックはこれが可能であることを暗示していますが、私はそれを行う方法がわかりません〜つまり、それらを構成できるように定義する方法shape
やaccum
、それらを構成する方法がわかりません。
注2 は、文字通り上記のシグニチャを持つ関数であることを意味するものではありませんshape
。accum
これらは、上記のトラバーサルを実行するために必要なタイプの式です。