この機能はインポートを通じて利用できますか?
はい。ただし、サードパーティのインポートを介して:ScalazはのMonad
インスタンスを提供しますEither
。
import scalaz._, Scalaz._
scala> for {
| foo <- 1.right[String]
| bar <- "nope".left[Int]
| } yield (foo.toString + bar)
res39: Either[String,java.lang.String] = Left(nope)
現在if
、-guardは単調な操作ではありません。したがって、if
-guardを使用しようとすると、期待どおりにコンパイラエラーが発生します。
scala> for {
| foo <- 1.right[String]
| if foo > 3
| } yield foo
<console>:18: error: value withFilter is not a member of Either[String,Int]
foo <- 1.right[String]
^
上記で使用されている便利なメソッド-.right
および.left
-もScalazからのものです。
編集:
私はあなたのこの質問を逃しました。
どちらかに独自の「モナドインスタンス」を提供したいとします。どうすればよいでしょうか。
Scalaのfor
内包表記は、単純に、、、に変換され、.map
関連するオブジェクトを呼び出します。(完全な変換スキームはここにあります。)したがって、一部のクラスに必要なメソッドがない場合は、暗黙的な変換を使用してそれらをクラスに追加できます。.flatMap
.withFilter
.filter
.foreach
以下の新しいREPLセッション。
scala> implicit def eitherW[A, B](e: Either[A, B]) = new {
| def map[B1](f: B => B1) = e.right map f
| def flatMap[B1](f: B => Either[A, B1]) = e.right flatMap f
| }
eitherW: [A, B](e: Either[A,B])java.lang.Object{def map[B1](f: B => B1): Product
with Either[A,B1] with Serializable; def flatMap[B1](f: B => Either[A,B1]):
Either[A,B1]}
scala> for {
| foo <- Right(1): Either[String, Int]
| bar <- Left("nope") : Either[String, Int]
| } yield (foo.toString + bar)
res0: Either[String,java.lang.String] = Left(nope)