【问题标题】:Understanding monad transformers in Scala理解 Scala 中的 monad 转换器
【发布时间】:2017-07-02 16:12:41
【问题描述】:

我正在尝试了解如何使用 Monad Transformers。我阅读了关于它的wiki article,但仍有一些问题。

我们有需要读取用户输入的IO monad。但并不总是提供输入。所以它是Option。为了简化,我们可以定义一个单子OptionT,它“封装”了IO单子的动作。

在我的特殊情况下,我有两个类型为 Future[Option[String]]Future[List[Int]] 的单子。这意味着为了简化它,我需要两个不同的转换器 ListT[T]OptionT[T] 分别用于我嵌入 Future 行为的每个 monad 类型......对吗?

【问题讨论】:

    标签: scala monads


    【解决方案1】:

    没错,monad 转换器的工作方式是帮助您处理正在被“外部”monad“转换”的“内部”monad。

    所以F[Option[A] 可以变成OptionT[F, A](其中F 是任何单子),这样更容易使用。

    关于ListT,可能没那么容易。例如cats 不提供,请参阅their FAQ 了解更多信息。正如他们建议的那样,您可以使用Nested 代替不需要flatMap 的情况,例如:

    import cats._
    import cats.implicits._
    import cats.data.Nested
    import scala.concurrent.Future
    import scala.concurrent.Implicits.global
    
    val futList = Future(List(1, 2, 3))
    Nested(futList).map(_ + 1).value // Future(List(2, 3, 4))
    

    如果您想了解 monad 转换器的其他内容,请查看我撰写的一篇短文:https://blog.buildo.io/monad-transformers-for-the-working-programmer-aa7e981190e7

    【讨论】:

    • 您在F[Option[A] 中缺少]
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 2018-05-06
    • 2018-03-10
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多