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 件のコメント:
コメントを投稿