type MapReaderOrOption[A] = ReaderT[Option, Map[String,String], A]
我可以从
ReaderT.apply
创建它:def f:MapReaderOrOption[Int] = ReaderT(_ => Option(10))
从 A 类型通过类型丰富和纯方法:
import cats.Applicative
import cats.syntax.int._
def f:MapReaderOrOption[Int] = 10.pure[MapReaderOrOption]
我想找到类似的东西。每次使用 ReaderT(..) 都不那么方便。当然,我可以创建一个辅助方法。问题是,还有其他选择吗?
预期类似:
def f:MapReaderOrOption[Int] = Option(10).asReaderT[MapReaderOrOption]
最佳答案
采用 F[A]
的方法并将其提升到 HK[F, A]
对于一些更高级的结构HK
一直被称为 liftF
穿过图书馆。
在您的情况下,它将是 Kleisli.liftF
, 自 ReaderT
只是 Kleisli
的别名:
import cats.data.ReaderT
import cats.data.Kleisli.liftF
type MapReaderOpt[A] = ReaderT[Option, Map[String, String], A]
val x: MapReaderOpt[Int] = liftF(Option(42))
如
liftF
看起来太模糊了,你仍然可以将它重命名为 {liftF => liftToReaderT}
在重命名导入期间。
关于scala - 从 F[A] 创建 ReaderT[F, D, A],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56493458/