私はちょうどスカラ、より具体的にはState Monadの猫のライブラリーを調べました。猫のStateMonadの配列
私は潜在的に大きな文字列(のStringBuilder)を分割し、分割文字列と残りのStringBuilderを返すいくつかのロジックを作成したいのおもちゃの例として:
Stateモナドの作品の一つのステップを実行しているobject Splitter {
def apply(maxSize: Int, overlap: Int): State[StringBuilder, String] = State(
builder => {
val splitPoint = math.min(builder.size, maxSize + overlap)
(builder.drop(maxSize), builder.substring(0, splitPoint))
}
)
}
をStringBuilderのは、最終的に空になるまで罰金が、私はチェーンにすべてのステップを望んでいた:
val stop = State.inspect((s: StringBuilder) => s.isEmpty)
Splitter(3, 2).untilM[Vector](stop).run(new StringBuilder("tarsntiars"))
しかし、untilMはモナドの形質のメンバーであるとして、これは動作せず、暗黙の変換は、スコープ内に存在しません。どのように動作します:
val monad = StateT.catsDataMonadForStateT[Eval, StringBuilder]
monad.untilM[List, String](Splitter(3, 2))(stop).run(new StringBuilder("tarsntiars"))
しかし、私は短いとはるかに読みやすいので、私はそれが動作しないのだろうかと思う?通常のMonadOpsメカニズムがここで動作しないのはなぜですか?
「停止」とは何ですか? – mtk
私はstopの定義を追加しました。 – peri4n