【发布时间】:2018-06-16 22:27:32
【问题描述】:
从 Scala 单子开始。人们经常会遇到处理 monad 的 Monad 的情况,并要求将其转换为单个 monad 以方便我们。例如,
Set[IO[Either[A,B]] -> IO[Set[C]]
虽然这可以通过转成sequence再map来实现,
monadSet
.toList
.sequence[IO, Either[A,B]]
.map(...)
当有多个时它会变得复杂,
说IO[IO[Set[Either[A,B]]]] 或Future[Set[Either[A, Future[B]]。通常如何处理这些嵌套的 monad 还不是很清楚。这方面的任何资源都会有所帮助。
编辑:相同类型的嵌套单子通常不是问题。主要问题是不同类型的嵌套 monad。
【问题讨论】:
-
Haskell 将使用允许您嵌套 monad 的 Monad 转换器来处理这些问题。有人可能会指出更好和更新的来源,但您可以尝试:page.mi.fu-berlin.de/scravy/realworldhaskell/materialien/…
-
@MarcTalbot,这是我所知道的最好的。
Data.Map的一个小改动打破了那里的一件事:lookup现在有一个不太通用的类型。一旦你看到这一点,就很容易解决这个问题。本教程也可能缺少Applicative实例。MonadFail进程很快就会成功。更新教程以跟上世界的步伐真是太好了。 -
这似乎是对
haskell标签的滥用,因为问题是关于scala。 -
@hnefatl 谢谢,是的。我想知道对此的一般看法,所以添加了haskell。删除它,但 Scala 回答就足够了。
标签: scala functional-programming monads monad-transformers