我试图了解如何使用 Monad Transformers。我读了wiki article关于它,仍然有一些问题。
我们有IO
需要读取用户输入的 monad。但并不总是提供输入。所以它是 Option
.为了简化,我们可以定义一个 monad OptionT
它“封装”了 IO
的操作单子(monad)。
在我的特殊情况下,我有两种类型的单子(monad) Future[Option[String]]
和 Future[List[Int]]
.这意味着简化它我需要两个不同的变压器ListT[T]
和 OptionT[T]
对于我嵌入的每种单子(monad)类型 Future
行为……对吧?
最佳答案
是的,monad 转换器的工作方式是帮助您处理正在被“外部”monad“转换”的“内部”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 更改器(mutator)有另一种看法,这是我撰写的一篇短文:https://blog.buildo.io/monad-transformers-for-the-working-programmer-aa7e981190e7
关于scala - 理解 Scala 中的 monad 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868593/