2017-03-01 61 views
0

我需要包裝一堆函數返回Either[String, X] - 爲理解,還需要轉換一些調用的結果使用一些純函數和緩存那些結果在臨時變量中。斯卡拉::理解和任意與自由變量

以下(非常人工的)代碼不編譯

1: def someFunc(x: Int): Either[String, Int] = Right(x) 
2: 
3: def someMath(i: Int): Int = i 
4: 
5: val z = for { 
6: x <- Right("aaaa").right 
7: y <- Right((1, x)).right 
8: tmp = someMath(y._1) 
9: t <- Right(tmp).right 
A: l <- someFunc(tmp).right 
B: } yield l 
C: 
D: z 

Error:(7, 6) value flatMap is not a member of Product with Serializable with scala.util.Either[Nothing,((Int, String), Int)] y <- Right((1, x)).right ^

如何定義的任意類型(也未)在for {...}表達式中的變量?

+0

我在'scala-2.11.8'下重現了這個錯誤。但在'scala-2.12.1'下,它工作正常。 –

回答

0

在斯卡拉2.12,Either是可以使用for組成一個單子的類型,所以以下工作:

val z = for { 
    x <- Right("aaa") 
    y <- Right((1, x)) 
... 
} 

正如在評論中提到@jdevelop,這並不在2.10或2.11

工作

如果您的Left類型是例外,那麼Try是一個很好的選擇。如果你需要一個便攜版本的Either,寫入一個並不困難,就像那樣令人討厭。

+0

Scala中沒有'flatMap' 2.11 – jdevelop

+0

@jdevelop好點,我一直可以用Try來代替。 – eje