Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaのCatsにifMという便利なやつがある

ScalaのCatsにifMという便利なやつがある。IO[Boolean]に対して条件分岐を適用して、trueの場合とfalseの場合とで異なるIOを返すというもの。別にIOでなくとも良くて、Monadなどの仲間であればifMは定義されている。例えばOption[Boolean]に対してもifMが使える。

http://typelevel.org/cats/api/cats/index.html?search=ifm

このようなシチュエーションがあるときにifMを使うとシンプルになる:

val condition: IO[Boolean] = ...

condition.flatMap { cond =>
  val ioForTrue: IO[A] = ...
  val ioForFalse: IO[A] = ...
  if (cond) { ioForTrue } else { ioForFalse }
}

conditionの内容をflatMapで展開し、Booleanの値によってioForTrueを呼んだりioForFalseを呼んだりしている。このようなパターンはifMで置換可能だ:

val condition: IO[Boolean] = ...
val ioForTrue: IO[A] = ...
val ioForFalse: IO[A] = ...

condition.ifM(ioForTrue, ioForFalse)

条件がIOでなくても、IO.pure(boolean)とすることで短く書けるようになるので、使ってみると良いだろう。

typelevel.org

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?