了解Scala中的monad变换器

时间:2017-07-02 07:53:16

标签: scala monads

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

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

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

1 个答案:

答案 0 :(得分:4)

对吧,monad变形金刚的工作方式是帮助你使用内部变形金刚#34;正在变形的monad"通过"外部"单子。

因此F[Option[A]可以转换为OptionT[F, A](其中F是任何monad),这样更容易使用。

关于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