1
任何人都可以告訴我,如果在Scala中可以使用以下語法行嗎?對於理解類型檢查
@annotation.tailrec
def traverse[E,A,B](es: List[A])(f: A => Either[E, B]): Either[E, List[B]] = {
def go(es: List[A], rs: Either[E, List[B]]): Either[E, List[B]] = {
es match {
case Nil => rs
case x::xs => for {
Right(b) <- f(x);
Right(ls) <- rs
} yield go(xs, Right(b::ls))
}
}
go(es, Right(List()))
}
我一直得到下面的語法異常
Error:(47, 12) constructor cannot be instantiated to expected type;
found : A$A400.this.Right[A]
required: List[?B3] where type ?B3 <: B (this is a GADT skolem)
Right(ls) <- rs
^
嘗試將rs匹配爲Left還是Right? – Ashalynd
多數民衆贊成我正在努力實現,但我得到的例外 – MrX
我認爲不太可能的編譯器將解決你的函數是tailrecursive。 for將解析成flatmap/Map並作爲函數傳遞yield。它要求編譯器稍微調整一下,這是一個尾部調用。 –