我正在尝试了解如何使用Monad变形金刚。我阅读了关于它的wiki article,但仍有一些问题。
我们需要IO
monad来读取用户的输入。但并不总是提供输入。所以它是Option
。为了简化,我们可以定义一个monad OptionT
,它“封装”IO
monad的行为。
在我的特定情况下,我有两个类型Future[Option[String]]
和Future[List[Int]]
的monad。这意味着要简化它我需要为每个monad类型分别使用两个不同的变换器ListT[T]
和OptionT[T]
,其中我嵌入了Future
行为......对吗?
答案 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