こんにちは。for式でStateをチェインさせたら面倒なことになりまして。
def proc: State[A, Unit] = { for { st <- get[A] _ <- someActor ! someMessage _ <- println("ほげほげ") st3 <- get[A] } yield st3 }
ここの、
_ <- someActor ! someMessage
_ <- println("ほげほげ")
ここが問題になりました。Scalaとしては、ここにはStateモナドが欲しかったらしく、コンパイルが通りません。
そんなこといわれてもここで処理したいので、「処理はするけど状態に影響しないStateを生成するメソッド」を作ります。
def pass[T](f: Any): State[T, Unit] = State[T, Unit]{(x: T) =>
(x, Unit)
}
こんなのができました。当初はfの型をどうするのか悩みましたが、とりあえずAnyで動くのでよしとします。(おい)
そういうわけで、先の処理は以下のように書き直されます。
def proc: State[A, Unit] = { for { st <- get[A] _ <- pass(someActor ! someMessage) _ <- pass(println("ほげほげ")) st3 <- get[A] } yield st3
これですっきりですね。めでたしめでたし。