为什么绑定会使列表变平?

Why does bind flatten the List?

奇怪,你说flatMap是monad的bind方法。 bind 方法采用将 monad 的包含项映射到另一个 monad 的函数。就是这样

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

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

就像 Option monad 的 bind 没有 return 一个选项的选项一样,List monad 的 bind 不是 return 列表列表。这个 joining 是 monad 的全部要点——它们不仅仅是函子:

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

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