2017-10-12 9 views
1

私はちょうどスカラ、より具体的には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メカニズムがここで動作しないのはなぜですか?

+0

「停止」とは何ですか? – mtk

+0

私はstopの定義を追加しました。 – peri4n

答えて

1

SI-2712が修正された後、Unapply回避策がCats:https://github.com/typelevel/cats/pull/1583から削除されました。 StateMonadとして扱うためには、-Ypartial-unificationコンパイラフラグ(Scala 2.11または2.12を使用していると仮定します)が必要です。

ScalazにはまだUnapplyという機械がありますので、コンパイラのフラグを付けずにコードをScalazで使用する必要があります。

+0

答えをありがとう。これが受け入れられる回答であるため、IntelliJ IDEAで構文の強調表示が解除されることを追加したいと思います。彼らはそれを認識しています。https://youtrack.jetbrains.com/issue/SCL-11320 – peri4n

+0

2.11.9より前のバージョンのScala 2.11やScala 2.10を使用している場合は注意が必要ですあなたはまだこのsbtプラグインを使用して部分的統合修正を有効にすることができます:https://github.com/fiadliel/sbt-partial-unification(ボーナス:サポートされているバージョンを使用している場合、プラグインはフラグを有効にします) –

関連する問題