【问题标题】:Create ReaderT[F, D, A] from F[A]从 F[A] 创建 ReaderT[F, D, A]
【发布时间】:2019-10-22 21:50:44
【问题描述】:
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]

【问题讨论】:

    标签: scala scala-cats reader-monad


    【解决方案1】:

    采用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}

    【讨论】:

    • 这里似乎也需要x 的类型定义,因为第二个类型参数是不变的并且推断为Nothing 使得ReaderT 推断为xMapReaderOpt[Int] 不兼容跨度>
    • @BogdanVakulenko 确实可能是这样,谢谢。明确地赋予类型而不是将其留给 cmets。通常,这不是问题,因为类型是从上下文中推断出来的。
    • @AndreyTyukin,顺便问一下,有没有办法通过类似于 liftF 的方法从 D 创建 ReaderT[F,D,A] ?除了 ReaderT.apply of cause。
    • @Alexandr 不确定单个D 是否足以创建ReaderT[F, D, A] - 谁或什么会指定如何构造A
    • @AndreyTyukin,问得好。我会改写它。一个函数返回 ReaderT[F,D,A] 并且这个函数组合了其他也通过 for-comprehension 返回 ReaderT[F,D,A] 的函数。有时我希望能够不将 D 传递给那个小函数,而是在 D 的实例上调用函数,以便理解。所以我必须以某种方式从 D 创建 ReaderT[F,D,D],(我认为)。希望我现在已经足够清楚了,否则将创建一个具有确切用例的单独问题。
    【解决方案2】:
    type MapReaderOrOption[A] = ReaderT[Option, Map[String,String], A]
    
    implicit class toReader[F[_],T](f: F[T]) {
      def asReaderT[K] = ReaderT[F,K,T](_ => f)
    }
    
    def f:MapReaderOrOption[Int] = Option(10).asReaderT
    

    或者如果没有明确提供f 类型,您需要定义K 参数。

    def f = Option(10).asReaderT[Map[String,String]]
    

    所以现在f 的类型将被推断为ReaderT[Option, Map[String,String], Int]。我认为在这种情况下你甚至不需要类型别名。

    或另一种选择

    def f = Option(10).asReaderT:MapReaderOrOption[Int]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多