2017-03-01 4 views
0

Either[String, X]を返す関数をまとめておく必要があります。また、純粋な関数とキャッシュを使っていくつかの呼び出しの結果を変換する必要がありますそれらの結果は一時変数になります。Scala ::理解のために、フリー変数を使って

(非常に人工的な)次のコードは、

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 {...}式では(ないいずれかの)任意の型の変数を定義していますか?スカラ2.12で

+0

私はこのエラーを 'scala-2.11.8'で再現しました。しかし 'scala-2.12.1'ではうまく動作します。 –

答えて

0

は、Eitherforを用いて構成することができるモナド型であるため、次の作品は:

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

コメントで述べ@jdevelopように、これは、2.10または2.11

に動作しません

Leftタイプが例外の場合は、Tryを使用するとよいでしょう。 Eitherの移植可能なバージョンが必要な場合は、それを迷惑なものとして書き込むのは難しくありません。

+0

Scala 2.11で 'flatMap'はありません。2.11 – jdevelop

+0

@jdevelop良い点、私はいつもTryを代わりに使うことができました。 – eje

関連する問題