Functional programming 为什么bind会使列表变平?

Functional programming 为什么bind会使列表变平?,functional-programming,bind,monads,flatmap,Functional Programming,Bind,Monads,Flatmap,我想知道,你说flatMap是monad的bind方法。bind方法使用一个函数将monad的包含项映射到另一个monad。这是怎么回事 option.flatMap(item => another option (f(item))) 给我另一个单子,里面有f(item)。但是,应用于列表意味着什么?通过strightforward扩展,如果您将每个列表项映射到(列表)单子,那么您将得到整个列表。为什么bind应用于列表时会将结果展平?与选项一样,monad的绑定不会返回选项的选项,列

我想知道,你说
flatMap
是monad的
bind
方法。bind方法使用一个函数将monad的包含项映射到另一个monad。这是怎么回事

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

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

选项一样,monad的绑定不会返回选项的选项,列表monad的绑定也不会返回列表的列表。这种连接是单子的全部要点——它们不仅仅是函子:

// Functor m
fmap :: (a -> b) -> m a -> m b
// Monad m
bind :: (a -> m b) -> m a -> m b // not m (m b)!
对于列表,这是通过展平它们来实现的。

“到另一个单子”应为“…将包含的项映射到同一个单子的容器”