scala - 理解 Scala 中的 monad 转换器

标签 scala monads

我试图了解如何使用 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/

相关文章:

haskell - 为什么 Haskell monadic 是左结合的?

haskell - 为什么 `join` 不是 `Monad` 类的一部分

javascript - 如何为 monad 实现通用提升功能?

scala - 在 Play 框架中,将数组传递给 View 的语法是什么?

scala - 读取 parquet 文件时无法解析具有 int 和 double 的合并架构

scala - 使用反射获取 Scala 中实现特征的所有类

haskell - 嵌套的迭代器

Scala:以简单的自定义类型实现 map 和 withFilter

scala - 如何防止gitlab ci每次都下载sbt?

scala - 我可以对我的 scala 代码做些什么,以便它编译得更快?