【问题标题】:Monad of monads to monads单子到单子的单子
【发布时间】: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 进程很快就会成功。更新教程以跟上世界的步伐真是太好了。
  • Monad 转换器已经被提及。 Here'scats scala 库中使用它们的教程。 this 是一种不同的组合单子的方法,单子也是猫的一部分。
  • 这似乎是对haskell标签的滥用,因为问题是关于scala
  • @hnefatl 谢谢,是的。我想知道对此的一般看法,所以添加了haskell。删除它,但 Scala 回答就足够了。

标签: scala functional-programming monads monad-transformers


【解决方案1】:

感谢 cmets。虽然一般来说 monads 不构成,但我发现 herding cats monad transformers 在一定程度上解决了这个问题。

特别是 EitherToptionT 包裹了多个 monad,并提供了处理 monad 的通用方法。它们很直观,blog 也有助于理解其背后的动机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多