代码之家  ›  专栏  ›  技术社区  ›  gurghet

如果m是monad,如何将list[m[list[a]]]正确地组合成m[list[a]]?

  •  1
  • gurghet  · 技术社区  · 8 年前

    我有单子可以把单子包装起来。我想合并这些单子,形成一个单子,包装所有列表的连接。

    M[List[A]] + M[List[A]] ==> M[List[A]]
    

    为了达到这个目的,我做了如下的事情 (伪代码) 以下内容:

    (1 to 10).foldLeft(Option(List(0)))((accumulator, i) => {
      for {
        prev <- accumulator
        more <- Option(List(i))
      } yield prev ++ more
    })
    

    这似乎是编译的,但我觉得应该更简单 更短的 比这个更重要。有什么改进意见吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Andrey Tyukin    8 年前

    有一个例子 Traverse[List] 是的。 每 Monad[M] 是一种特殊情况 Applicative[M] 是的。因此,如果你有

    List[M[List[A]]]
    

    你应该可以使用 sequence 在里面 遍历[列表] 适用的 先把它变成

    M[List[List[A]]]
    

    然后使用 map Functor[M] flatten 它变成

    M[List[A]]
    

    有点像

    val lists: List[Option[List[A]]] = ???
    val optLists: Option[List[List[A]]] = Traverse[List].sequence(lists)
    val optList: Option[List[A]] = optLists.map(_.flatten)
    

    在这种情况下 Option 是的。

        2
  •  0
  •   mibon    8 年前

    我认为半群(或半群k)可能是你正在寻找的抽象概念

    推荐文章