EitherとBooleanの相互変換のイディオムです。
EitherのRightを真、Leftを偽として扱うことを想定しています。逆の場合は、真偽の判定を反転させてください。
(分類の基準)
Java風
Boolean→Either
BooleanをEitherに変換する場合は、if式による判定を用いて、Booleanの真偽に対応する値をLeftまたはRightに詰めます。
def f[T](v: Boolean, e: Throwable, s: T): Either[Throwable, T] = { if (v) Right(s) else Left(e) }
Either→Boolean
EitherをBooleanに変換する場合は、EitherのisRihtメソッドを用います。
def f[T](e: Either[Throwable, T]): Boolean = { e.isRight }
Scala風
Boolan→Either
BooleanをEitherに変換する場合は、match式による判定を用いて、Booleanの真偽に対応する値をLeftまたはRightに詰めます。
def f[T](v: Boolean, e: Throwable, s: T): Either[Throwable, T] = { v match { case true => Right(s) case false => Left(e) } }
しかし、Java風で説明したif式方式の方が簡明なのでそちらを用いたほうがよいでしょう。
Either→Boolean
EitherをBooleanに変換する場合は、match式でLeftまたはRightで判定することができます。
def f[T](e: Either[Throwable, T]): Boolean = { e match { case Right(_) => true case Left(_) => false } }
しかし、Java風で説明したifRightメソッドの方が簡明なのでそちらを用いたほうがよいでしょう。
Scala
Boolan→Either
BooleanをEitherに変換するMonadicな演算はないと思います。Java風で説明したif式方式を用いるとよいでしょう。
Either→Boolean
EitherをBooleanに変換するMonadicな演算はないと思います。Java風で説明したifRightメソッドを用いるとよいでしょう。
Scalaz
Boolan→Either
Scalazでは、Booleanにeitherメソッドが追加されており、以下のようにしてEitherを生成することができます。eitherの直後にLeft側の値、orの直後にRight側の値を指定します。
def f[T](v: Boolean, e: Throwable, s: T): Either[Throwable, T] = { !v either e or s }
直感的にはeitherの直後に真の値、orの直後に偽の値が入りますが、実際にはeitherの直後はLeftなので偽の値、orの直後はRightなので真の値が入ります。Boolean値の判定を反転させることで、意図した動作になります。
Either→Boolean
ScalazではEitherをBooleanに変換する便利なメソッドは用意していません。Java風で説明したifRightメソッドを用いるとよいでしょう。
諸元
- Scala 2.9.1
- Scalaz 6.0.3
0 件のコメント:
コメントを投稿