2012年4月9日月曜日

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

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

コメントを投稿