代码之家  ›  专栏  ›  技术社区  ›  Knows Not Much

Scala猫将值提升到Monad Transformers中

  •  2
  • Knows Not Much  · 技术社区  · 7 年前

    this 关于将值提升到Monad Transformer的文档。

    基于此,我编写了以下代码

    import cats.data._
    import cats.implicits._
    type FutureOption[T] = OptionT[Future, T]
    val x : FutureOption[Int] = 1.pure[FutureOption] // works
    val y : FutureOption[Int] = OptionT.fromOption[Future](Some(10)) // works
    val z : FutureOption[Int] = OptionT.liftF(Future.successful(10)) // works
    

    val z = FutureOption[Int] = OptionT(Future.successful(Some(10)))
    

    我出错了

    cmd4.sc:1: no type parameters for method apply: (value: F[Option[A]])cats.data.OptionT[F,A] in object OptionT exist so that it can be applied to arguments (scala.concurrent.Future[Some[Int]])
     --- because ---
    argument expression's type is not compatible with formal parameter type;
     found   : scala.concurrent.Future[Some[Int]]
     required: ?F[Option[?A]]
    val x : OptionT[Future, Int] = OptionT(Future.successful(Some(10)))
                                   ^
    cmd4.sc:1: type mismatch;
     found   : scala.concurrent.Future[Some[Int]]
     required: F[Option[A]]
    val x : OptionT[Future, Int] = OptionT(Future.successful(Some(10)))
                                                            ^
    cmd4.sc:1: type mismatch;
     found   : cats.data.OptionT[F,A]
     required: cats.data.OptionT[scala.concurrent.Future,Int]
    val x : OptionT[Future, Int] = OptionT(Future.successful(Some(10)))
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Gabriele Petronella    7 年前

    该错误是由Scala类型推断引起的。

    在没有明确的 Option 类型注释,类型 Some(10) Some[Int] 它是 Option[Int] OptionT 准确地期望 选项 所以它不会编译。

    val z: FutureOption[Int] = OptionT(Future.successful(Option(10)))
    

    val z: FutureOption[Int] = OptionT(Future.successful(Some(10): Option[Int]))
    
        2
  •  1
  •   redarqas    6 年前

    加布里埃尔提供的解决方案的替代方案。您可以使用cats lib提供的语法

    import cats.syntax.option._ 
    

    然后

    val z: FutureOption[Int] = OptionT(Future.successful(10.some))
    
    Or 
    
    val z: FutureOption[Int] = OptionT(Future.successful(none[Int]))
    

    10.some none[Int] 将推断为 Option[Int]

    P、 S:也有一个语法表示通过 cats.syntax.either._ 10.asRight[String] "Oops".asLeft[Int] 将推断为 Either[String, Int]