Lambdaカクテル

Common LISPが好きなWeb屋さんです 自宅サーバやフロントエンドもできます

なにもしないStateモナド

こんにちは。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

これですっきりですね。めでたしめでたし。