我一直在研究 FP 语言(断断续续),并且使用过 Scala、Haskell、F# 和其他一些语言。我喜欢我所看到的并理解 FP 的一些基本概念(绝对没有范畴论的背景——所以请不要谈论数学)。
因此,给定一个类型M[A]
,map
它接受一个函数A=>B
并返回一个M[B]
. 但是我们也有flatMap
which 接受一个函数A=>M[B]
并返回一个M[B]
. 我们也有flatten
which 接受 aM[M[A]]
并返回 a M[A]
。
此外,我读过的许多资料都描述flatMap
为.map
flatten
那么,鉴于这flatMap
似乎等同于flatten compose map
,它的目的是什么?请不要说它是为了支持“理解”,因为这个问题确实不是 Scala 特有的。我不太关心语法糖,而是关心它背后的概念。Haskell 的绑定运算符 ( ) 也会出现同样的问题>>=
。我相信它们都与某些类别理论概念有关,但我不会说那种语言。
我看过 Brian Beckman 的精彩视频Don't Fear the Monad不止一次,我想我知道那flatMap
是一元组合运算符,但我从未真正看到它使用他描述此运算符的方式。它执行此功能吗?如果是这样,我如何将该概念映射到flatMap
?
顺便说一句,我对这个问题写了很长的文章,其中有很多清单显示了我试图深入了解其含义的实验flatMap
,然后遇到了这个问题,它回答了我的一些问题。有时我讨厌 Scala 的隐式。他们真的可以搅浑水。:)