Scala 2.9.1 を使用して、次の 2 つのインスタンスを検討してEither
ください。
scala> val er: Either[String, Int] = Right(1)
er: Either[String,Int] = Right(1)
scala> val el: Either[String, Int] = Left("a")
el: Either[String,Int] = Left(a)
left
and射影を使用することで、for 内包表記を使用できるのは素晴らしいことです (射影されright
た Both の偏ったモナドを介して):
scala> for { r <- er.right } yield r * 2
res6: Product with Either[String,Int] with Serializable = Right(2)
scala> for { r <- el.right } yield r * 2
res7: Product with Either[String,Int] with Serializable = Left(a)
filter
メソッドがどちらかを返さないという決定が下された理由を誰かが私に説明できますか? 私は次のように動作することを期待していました:
scala> for { r <- er.right if r > 2 } yield r * 2 // r is NOT greater than 2!
res8: Product with Either[String,Int] with Serializable = Left(a)
代わりに、次のエラーが発生します: :9: エラー: 値 * は、Either[Nothing,Int] のメンバーではありません { r <- er.right if r > 2 } yield r * 2
基になる呼び出しがEither.RightProjection#filter
実際に を返すようOption
です:
scala> er.right.filter(_ > 2)
res9: Option[Either[Nothing,Int]] = None
これは、少なくとも私が使用しようとしていた方法では、for-comprehension での if 句の使用を無効にします。
なぜこのデザインになったのか説明できる人はいますか?