2017-03-14 1 views
0

Ich habe ein Problem mit OptionT mit der unten-comp mit:Wie einen optionalen Parameter zu übergeben, wenn Scalaz OptionT

for { 
    fuOpt1 <- OptionT(...) 
    fuOpt2 <- OptionT(...) 
    fuOpt3 <- OptionT(getF3(fuOpt1.optionalInt)) 
} yield agg(fuOpt1, fuOpt2, fuOpt3) 

Das Problem ist in getF3, die wie folgt aussieht:

def getF3(a: Int): Future[Option[F3]] 

Die Eigenschaft auf fuOpt1.optionalInt ist Option [Int].

Was muss ich ändern, damit die Komponente richtig funktioniert?

Ich versuchte dies aber es hat nicht funktioniert:

if (fuOpt1.optionalInt.isDefined) OptionT(getF3(fuOpt1.optionalInt.get)) else Future.successful(None).liftM[OptionT] 

Antwort

0

Hier sind ein paar Optionen.

hinzufügen, einen Generator zu Ihrem für das Verständnis:

for { 
    fuOpt1 <- OptionT.optionT(...) 
    fuOpt2 <- OptionT.optionT(...) 
    a <- OptionT.optionT(Future.successful(fuOpt1.optionalInt)) 
    fuOpt3 <- OptionT.optionT(getF3(a)) 
} yield agg(fuOpt1, fuOpt2, fuOpt3) 

Oder eine Falte auf fuOpt1.optionalInt verwenden, die zu schließen ist, was Sie versucht:

for { 
    fuOpt1 <- OptionT.optionT(...) 
    fuOpt2 <- OptionT.optionT(...) 
    fuOpt3 <- fuOpt1.optionalInt.fold(OptionT.none[Future, F3])(a => OptionT.optionT(getF3(a))) 
} yield agg(fuOpt1, fuOpt2, fuOpt3) 

Oder wickeln Sie Ihre getF3 in einer Version das akzeptiert eine Option:

def getF3Opt(a: Option[Int]): Future[Option[F3]] = { 
    a.fold(Future.successful(None: Option[F3]))(getF3) 
} 

for { 
    fuOpt1 <- OptionT.optionT(...) 
    fuOpt2 <- OptionT.optionT(...) 
    fuOpt3 <- OptionT.optionT(getF3Opt(fuOpt1.optionalInt)) 
} yield agg(fuOpt1, fuOpt2, fuOpt3) 
0

Meine Hypothese ist, dass wenn fuOpt1.optionalInt == None, dann sollte Ihr Verständnis bei Future.successful(None) "fehlschlagen". Wenn diese Hypothese Ihre Situation passen als können Sie schreiben:

for { 
    fuOpt1 <- OptionT(...) 
    fuOpt2 <- OptionT(...) 
    optionalInt <- OptionT(fuOpt1.optionalInt.point[Future]) 
    fuOpt3 <- OptionT(getF3(optionalInt)) 
} yield agg(fuOpt1, fuOpt2, fuOpt3) 
Verwandte Themen