Scala Cats 将值提升到 Monad Transformers
Scala Cats Lifting values into Monad Transformers
我正在阅读 this 有关将值提升到 Monad Transformers 中的文档。
基于此我写了如下代码
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)))
错误是由于 Scala 类型推断造成的。
在没有显式 Option
类型注释的情况下,Some(10)
的类型是 Some[Int]
,它是 Option[Int]
的子类型。然而 OptionT
期望正好 Option
所以它不会编译。
你可以编译通过
val z: FutureOption[Int] = OptionT(Future.successful(Option(10)))
或
val z: FutureOption[Int] = OptionT(Future.successful(Some(10): Option[Int]))
Gabrielle 提供的解决方案的替代方案。您可以使用 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:Either 也有语法通过 cats.syntax.either._
10.asRight[String]
和 "Oops".asLeft[Int]
将被推断为 Either[String, Int]
我正在阅读 this 有关将值提升到 Monad Transformers 中的文档。
基于此我写了如下代码
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)))
错误是由于 Scala 类型推断造成的。
在没有显式 Option
类型注释的情况下,Some(10)
的类型是 Some[Int]
,它是 Option[Int]
的子类型。然而 OptionT
期望正好 Option
所以它不会编译。
你可以编译通过
val z: FutureOption[Int] = OptionT(Future.successful(Option(10)))
或
val z: FutureOption[Int] = OptionT(Future.successful(Some(10): Option[Int]))
Gabrielle 提供的解决方案的替代方案。您可以使用 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:Either 也有语法通过 cats.syntax.either._
10.asRight[String]
和 "Oops".asLeft[Int]
将被推断为 Either[String, Int]