2017-03-27 32 views
1

我創造了這個簡單的單子轉換如何分配未來的[選項[INT]]對OptionT [未來,INT]

type FutureOptionInt = OptionT[Future, Int] 

現在我可以很容易地通過

1.pure[FutureOptionInt] 
創建的這個實例

這很好。但我有另一個函數返回給我一個Future [Option [Int]]。我無法將此功能的輸出更改爲MT

因此我需要將返回類型分配給我的MT。

我試圖

val y = Future(Option(1)) 
val x : FutureOptionInt = y 

,但我得到的錯誤

cmd5.sc:1: type mismatch; 
found : scala.concurrent.Future[Some[Int]] 
required: $sess.cmd3.FutureOption 
    (which expands to) cats.data.OptionT[scala.concurrent.Future,Int] 
val x : FutureOption = y 

所以現在的問題是,如果你有一個未來的[選項[INT]]你怎麼把它分配給OptionT [未來, INT]?

回答

1

您可以使用隱式轉換要做到這一點:

implicit def toTransformer(future: Future[Option[Int]]) = OptionT(future) 

然後分配你有作品。

這也可能對您有用抽象在選項裏面有什麼如下,這樣你就不必寫轉換器的負載:

implicit def toTransformer[T](future: Future[Option[T]]) = OptionT(future) 

type FutureOpt[T] = OptionT[Future, T] 

val intOpt = Future(Option(1)) 
val strOpt = Future(Option("")) 

val x : FutureOpt[Int] = intOpt 
val y : FutureOpt[String] = strOpt 
相關問題