2016-08-10 3 views
2

Future[Option[A]]を1つのforのように組み合わせる方法 - 次のスニペットは機能しますが、醜いように見えますが、より良い方法はありますか?異なるネストされたモナドを理解のために組み合わせる

def getOne: Future[Int] = Future.value(1) 

    def getSomeOne: Future[Option[Int]] = Future.value(Some(1)) 

    def main(args: Array[String]): Unit = { 
    val sum = for { 
     y <- OptionT(getOne.map(Some(_)).asInstanceOf[Future[Option[Int]]]) 
     x <- OptionT(getSomeOne) 
    } yield x + y 

    println(Await.result { sum.run }) 
    } 
+0

?私は 'scala.concurrent.Future'にメソッド値を見つけることができません。 – pedrofurla

+0

'twitter.util.Guture'。 「Functor」と「Monad」のインスタンスが長い間は問題ありません – synapse

+0

心配はありません。 – pedrofurla

答えて

1

OptionT(getOne.map(Option(_))はキャストなしで動作します。あなたのコードの問題は、SomeのタイプがSomeではないということです。 Scalaの将来の使用

scala> :paste 
(for { 
    y <- OptionT(getOne.map(Option(_))) 
    x <- OptionT(getSomeOne) 
} yield x + y).run 
res14: scala.concurrent.Future[Option[Int]] = List() 

scala> Await.result(res14, duration.Duration.Inf) 
res16: Option[Int] = Some(2) 

(それは印刷リストは、()、未実行の将来のために多分REPLことだ、なぜ全く分からない?)を使用しているどのような未来の

+0

'point [Option]'も同様です。しかし、「OptionT」へのすべての持ち上げは、特に複雑な理解のためには十分ではないことが判明しました。私は – synapse

+0

Some.typeが間違っていました。これはコンパニオンオブジェクトのタイプになります。 – pedrofurla

+0

私はそれを提供するリフトを使用するのが少し良いと思う。 'y < - OptionT.optionTMonadTrans.liftM(getOne)' –

関連する問題