2015-10-18 28 views
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 
     ^
+0

嘗試將rs匹配爲Left還是Right? – Ashalynd

+0

多數民衆贊成我正在努力實現,但我得到的例外 – MrX

+0

我認爲不太可能的編譯器將解決你的函數是tailrecursive。 for將解析成flatmap/Map並作爲函數傳遞yield。它要求編譯器稍微調整一下,這是一個尾部調用。 –

回答

1

說實話,我不是很確定的功能的目的是什麼,但是,在什麼f是猜測,這裏的東西,可以做你想做的事情?

@annotation.tailrec 
    def f[A, B, E](e: A): Either[E, B] = ??? 

    def go[A, B, E](es: List[A], rs: Either[E, List[B]]): Either[E, List[B]] = { 
    es match { 
     case Nil => rs 
     case x :: xs => (f(x), rs) match { 
     case (Right(b), Right(ls)) => go(xs, Right(b :: ls)) 
     } 
    } 

    go(es, Right(List())) 
    }