私はScalaコードで、とりわけスレッド状態のMonadicスタイルの使用を開始する予定です。ここでは3つのモナドの機能を組み合わせること(副作用についてのみ思いやり)の簡単な例Scalaz - リストと州のモナドを組み合わせて理解する
import scalaz._
import Scalaz._
object MonadTest {
def adder(i: Int) = State[String, Int] ({str: String => (str + i.toString + " ", i) })
val oneTwoThreeMonad = for {
m1 <- adder(1)
m2 <- adder(2)
m3 <- adder(3)
} yield m3
oneTwoThreeMonad("start: ")._1 //String = "start: 1 2 3 "
}
だ。このすべては一目瞭然で、期待通りに動作します。しかし、私にとってこのアプローチが本当に便利であるためには、それをList
と組み合わせることができるようにしたいと考えています。ここで私が何を意味するか表示する(動作しない)コードのビットです:
val list = List(1, 2, 3)
val oneTwoThreeBis = for {
i <- list
mx <- adder(i)
} yield mx
基本的に私はList
からの引数に基づいてモナドを組み合わせることができるようにしたい - の各要素に単項関数を実行しますlist
と私は行くように副作用を蓄積する。私はこの例の構文がうまくいかないと理解しています。なぜそうでないのか分かります。私はちょうどきれいでエレガントなものを探しています。
scalazモナド変圧器を使用して、具体的にはStateT
を使用してこれを実現することは可能でしょうが、どのようにすればよいかわかりません。
PS。私はScalaz 7.0-M3を使用しているので、シンタックスは最も一般的な6.xと少し異なるかもしれません。
私が探しているもののように見えます。しかし実際には状態変圧器を実際に使用することを覚えなくてはならないという事実は変わらない; – nietaki
私はすでに 'traverse'と' traverseS'の詳細な記述あなたにもそれを賞賛しました。私はそれが私と一緒にいかなかったかを想像することはできません... – nietaki
誰かがScalazではなくCatsと似たようなことをする必要があるならば、 'traverseS'はありませんが、' traverseS'を使用して:https://github.com/benhutchison/gesture/blob/master/core/jvm/src/test/scala/gesture/GestureProcessorSpec.scala#L34 –