【问题标题】:Why does bind flatten the List?为什么绑定会使列表变平?
【发布时间】:2016-10-20 06:54:07
【问题描述】:

我想知道,你说 flatMap 是 monad 的 bind 方法。 bind 方法接受一个将 monad 包含的项目映射到另一个 monad 的函数。就是这样

option.flatMap(item => another option (f(item))) 

给了我另一个带有f(item) 的单子。但是,应用于 List 意味着什么?通过简单的扩展,如果您将每个 List 项目映射到一个 (list) monad,您将获得整个列表列表。为什么bind 应用于列表时会使结果变平?

【问题讨论】:

  • 到另一个 monad”应该读作“……将包含的项目映射到同一个 monad 的容器”

标签: functional-programming bind monads flatmap


【解决方案1】:

就像Option monad 的 bind 不返回选项的选项一样,List monad 的 bind 不返回列表列表。这个加入是单子的全部意义——它们不仅仅是函子:

// Functor m
fmap :: (a -> b) -> m a -> m b
// Monad m
bind :: (a -> m b) -> m a -> m b // not m (m b)!

对于列表,这是通过展平它们来完成的。

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2016-10-02
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多