Int => Int
で構成されたいくつかの関数があるとしandThen
ます。
val f1: Int => Int = _ + 1
val f2: Int => Int = _ + 2
val f3: Int => Int = _ + 3
val f = f1 andThen f2 andThen f3
ここで、中間結果も返す必要があります。したがって、これらすべての関数をInt => (List[Int], Int)
、リストに引数が含まれる場所に変換できます。
おそらくペアを表すためWriter[List[Int], Int]
にを使用できます。scalaz
(List[Int], Int)
val fw1: Int => Writer[List[Int], Int] = x => f1(x).set(List(x))
val fw2: Int => Writer[List[Int], Int] = x => f2(x).set(List(x))
val fw3: Int => Writer[List[Int], Int] = x => f3(x).set(List(x))
を構成するfw1
にはfw2
、fw3
おそらく でラップする必要がありますKleisli
。ただし、モナドではKleisli(fw1)
ないためコンパイルされません。Writer[List[Int], Int]
monad transformer
モナドを作るにはおそらく a が必要だと思いWriter[List[Int], Int]
ますが、それを行う方法が正確にはわかりません。だから、私の質問は:Kleisli(fw1)
モナドトランスフォーマーでコンパイルする方法は?