scala - 从 F[A] 创建 ReaderT[F, D, A]

标签 scala scala-cats reader-monad

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/

相关文章:

scala - 如何在 Scala 中执行以下正则表达式匹配?

Scala 类型类理解接口(interface)语法

scala - 当状态满足某些条件时如何停止状态转换?

haskell - f, g, h::Kleisli ((->) e) a b <=> f >>> (g &&& h) = (f >>> g) &&& (f >>> h)?

scala - 如何使sbt-native-packager结合两层docker镜像

scala - 如何在 Tomcat 上部署 Scala/akka 应用程序?

scala - 如何使用 Cats IO monad 实现 if-else 逻辑?

haskell - 重构使用 Reader monad 的 Haskell 函数

haskell - 实现 Reader monad(来自 Real World Haskell 书)

scala - 从类型 scala 中获取一个类