我正在嘗試編寫下面的驗證函數,以便驗證在遇到第一個錯誤後停止。返回類型three
與其他功能不同。我爲了編譯這個代碼而使用哪個monad變換器?要使用哪種Monad變壓器?
import scalaz._
import Scalaz._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def one(a : String): Disjunction[Int, String] =
a == "one" match {
case true => \/-("one")
case false => -\/(2)
}
def two(a : String): Disjunction[Int, String] =
a == "two" match {
case true => \/-("two")
case false => -\/(3)
}
def three(a : String): Future[Disjunction[Int, String]] =
Future (a == "three") map {
case true => \/-("three")
case false => -\/(4)
}
def validate(a : String) = for {
e1 <- one(a)
e2 <- two(a)
e3 <- EitherT(three(a))
} yield (e1 |+| e2 |+| e3)
編譯錯誤:
Error:(27, 7) type mismatch;
found : scalaz.EitherT[scala.concurrent.Future,Int,String]
required: scalaz.\/[?,?]
e3 <- EitherT(three(a))
^
Error:(66, 7) type mismatch;
found : scalaz.EitherT[scala.concurrent.Future,Int,String]
required: scalaz.\/[?,?]
e3 <- EitherT(three(a))
^
爲什麼你不會在'Future'或者''Wait''等待'three'結果中包含'one'和'two'? –
你想看一下'EitherT' monad變換器,你的第三個'<-'沒有返回'String',它給了你整個'Disjunction',它可能不是你想要的(前兩個訪問'字符串「部分的析取)。 –
@EndeNeu我試過EitherT,但仍然收到編譯錯誤。請參閱更新的問題以及編譯錯誤。我之前使用DisjunctionT(這只是EitherT的包裝),具有相同的結果。 –