【发布时间】:2016-03-18 00:35:12
【问题描述】:
我一直在研究 FP 语言(断断续续)一段时间,并使用过 Scala、Haskell、F# 和其他一些语言。我喜欢我所看到的并理解 FP 的一些基本概念(绝对没有类别理论背景 - 所以请不要谈论数学)。
所以,给定一个类型M[A],我们有map,它接受一个函数A=>B并返回一个M[B]。但是我们也有flatMap,它接受一个函数A=>M[B]并返回一个M[B]。我们还有flatten,它接受M[M[A]]并返回M[A]。
此外,我读过的许多资料都将flatMap 描述为map,后跟flatten。
那么,鉴于flatMap 似乎等同于flatten compose map,它的目的是什么?请不要说它是为了支持“理解”,因为这个问题确实不是 Scala 特有的。我不太关心语法糖,而是关心它背后的概念。 Haskell 的绑定运算符 (>>=) 也会出现同样的问题。我相信它们都与某些类别理论概念有关,但我不会说那种语言。
我不止一次观看了 Brian Beckman 的精彩视频 Don't Fear the Monad,我想我看到 flatMap 是一元组合运算符,但我从未真正看到它使用过他描述此运算符的方式。它执行此功能吗?如果是这样,我如何将该概念映射到flatMap?
顺便说一句,我对这个问题写了很长的文章,其中有很多清单显示了我试图弄清flatMap 含义的底部的实验,然后遇到了this question,它回答了我的一些问题。有时我讨厌 Scala 的隐式。他们真的可以搅浑水。 :)
【问题讨论】:
-
那么
xss.flatten不只是xss.flatMap(identity)的简写,所以flatten派生自flatMap,而不是反过来?虽然为了解释事情,我想flatten更容易理解。 -
@LuigiPlinge,是的,我也看到了这一点。我知道
flatMap提供的许多操作以及如何使用它。我只是不认为我真的了解它。似乎有一个我在某处无法完全理解的概念。
标签: scala functional-programming flatmap