2012年4月9日月曜日

Scala Tips / Either (18) - Booleanと相互変換

EitherとBooleanの相互変換のイディオムです。

EitherのRightを真、Leftを偽として扱うことを想定しています。逆の場合は、真偽の判定を反転させてください。

(分類の基準)

Java風

Boolean→Either

BooleanをEitherに変換する場合は、if式による判定を用いて、Booleanの真偽に対応する値をLeftまたはRightに詰めます。

  1. def f[T](v: Boolean, e: Throwable, s: T): Either[Throwable, T] = {  
  2.   if (v) Right(s) else Left(e)  
  3. }  
Either→Boolean

EitherをBooleanに変換する場合は、EitherのisRihtメソッドを用います。

  1. def f[T](e: Either[Throwable, T]): Boolean = {  
  2.   e.isRight  
  3. }  

Scala風

Boolan→Either

BooleanをEitherに変換する場合は、match式による判定を用いて、Booleanの真偽に対応する値をLeftまたはRightに詰めます。

  1. def f[T](v: Boolean, e: Throwable, s: T): Either[Throwable, T] = {  
  2.   v match {  
  3.     case true => Right(s)  
  4.     case false => Left(e)  
  5.   }  
  6. }  

しかし、Java風で説明したif式方式の方が簡明なのでそちらを用いたほうがよいでしょう。

Either→Boolean

EitherをBooleanに変換する場合は、match式でLeftまたはRightで判定することができます。

  1. def f[T](e: Either[Throwable, T]): Boolean = {  
  2.   e match {  
  3.     case Right(_) => true  
  4.     case Left(_) => false  
  5.   }  
  6. }  

しかし、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側の値を指定します。

  1. def f[T](v: Boolean, e: Throwable, s: T): Either[Throwable, T] = {  
  2.   !v either e or s  
  3. }  

直感的にはeitherの直後に真の値、orの直後に偽の値が入りますが、実際にはeitherの直後はLeftなので偽の値、orの直後はRightなので真の値が入ります。Boolean値の判定を反転させることで、意図した動作になります。

Either→Boolean

ScalazではEitherをBooleanに変換する便利なメソッドは用意していません。Java風で説明したifRightメソッドを用いるとよいでしょう。

諸元

  • Scala 2.9.1
  • Scalaz 6.0.3

0 件のコメント:

コメントを投稿