为什么绑定会使列表变平?
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)!
对于列表,这是通过展平它们来完成的。
奇怪,你说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)!
对于列表,这是通过展平它们来完成的。