我知道在Scala中,flatMap
的等价物是Clojure中的mapcat
。
我有一点猜想,在Clojure中,mapcat
只能处理序列,而Scala中的flatMap
更加灵活。
我的问题是:从它们所操作的内容来看,mapcat
和Scala中的flatMap
有什么区别?
假设:
- 我知道Scala拥有丰富的类型系统,而Clojure则是可选类型 - 我想知道是否有限制了mapcat接受参数的能力,使其只具有
flatMap
的一部分功能。
我知道在Scala中,flatMap
的等价物是Clojure中的mapcat
。
我有一点猜想,在Clojure中,mapcat
只能处理序列,而Scala中的flatMap
更加灵活。
我的问题是:从它们所操作的内容来看,mapcat
和Scala中的flatMap
有什么区别?
假设:
flatMap
的一部分功能。我对Scala有一些了解,似乎flatMap是Scala单子(Monad)中的bind函数,而mapcat则是Clojure序列单子(sequence monad)的一种可能实现。因此,它们在序列方面是相同的。
但是,例如Scala还针对Futures提供了一个flatMap函数:它接受一个Future和一个映射函数,并返回一个在输入Future完成后将完成的Future。这个操作在Clojure中似乎不是一个简单的mapcat。它可以采用以下方式实现:
(defn flat-map [f mv] (mapcat (fn [v] (future (f @v))) mv))
所以,不一样,无论是在它们操作的方面还是在Scala中flatMap是不同函数的常用名称,例如Futures的flatMap协调输入和输出的futures。在Clojure中简单的mapcat不起作用,因为它不会返回future。
flatMap
是所有 bind
函数在 Scala 中的通用名称。 - Alexey Romanovmapcat
适用于序列,而且几乎每种Clojure数据类型都可以是一个序列。如果你传递的参数不是一个 seq
,它会自动调用seq,因此实际上你可以将几乎所有Clojure值传递给mapcat 。如果你想遍历树,则需要调用 prewalk
或 postwalk
来指定遍历顺序。