Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure中的mapcat和Scala中的flatMap在操作上有什么不同?_Scala_Clojure - Fatal编程技术网

Clojure中的mapcat和Scala中的flatMap在操作上有什么不同?

Clojure中的mapcat和Scala中的flatMap在操作上有什么不同?,scala,clojure,Scala,Clojure,我知道Scala中的flatMap等价于Clojure 我有一种暗示,clojure中的mapcat只适用于序列,而Scala中的flatMap更灵活 我的问题是-Clojure中的mapcat和Scala中的flatMap在操作上有什么区别 假设: 我知道Scala有一个丰富的类型系统,Clojure有可选的类型-我想知道mapcat接受的参数是否有限制,使得它只有flatMaps功能的一个子集 它们看起来非常相似,似乎在处理相同的事情。通过查看文档,我看不到功能上的差异 mapcat适用于

我知道Scala中的
flatMap
等价于Clojure

我有一种暗示,clojure中的
mapcat
只适用于序列,而Scala中的
flatMap
更灵活

我的问题是-Clojure中的
mapcat
和Scala中的
flatMap
在操作上有什么区别

假设:

  • 我知道Scala有一个丰富的类型系统,Clojure有可选的类型-我想知道mapcat接受的参数是否有限制,使得它只有
    flatMap
    s功能的一个子集
它们看起来非常相似,似乎在处理相同的事情。通过查看文档,我看不到功能上的差异


mapcat
适用于序列,几乎每个clojure数据类型都可以是序列。如果您将不属于
seq
的内容传递给
mapcat
,它将自动调用seq,因此实际上您可以将几乎所有clojure值传递给mapcat。如果要在树上迭代,则需要调用
prewalk
postwark
来指定遍历顺序

在标准Scala库中:。它们都不是序列,也不是特别像序列。还有一个细微的变化。

我对Scala了解一点,但在我看来flatMap是monad中的Scala绑定函数,mapcat是Clojure中序列monad的绑定函数的可能实现。所以它们对于序列是相同的

但Scala有一个future的flatMap函数:它接受future和mapping函数,并返回一个future,该future将在输入future完成后完成。在Clojure中,此操作似乎不是一个简单的mapcat。它可以通过这种方式实现

(defn flat-map [f mv] (mapcat (fn [v] (future (f @v))) mv))

所以,不。它们是不同的,无论是在操作什么方面。在Scala中,flatMap是不同函数的通用名称,例如Futures的flatMap协调输入和输出Futures。Clojure中的简单mapcat不起作用,因为它不会返回未来。

真正的区别在于flatMap在类型上是多态的,而mapcat不是。因此,任何类型都可以决定提供类似“平面图”的行为。这就是为什么像期货这样的东西是可平面化的

在Clojure中,mapcat特定于seqable类型。任何seqable都可以强制转换为一个序列,所有序列都可以映射和连接。mapcat实现将检查输入是否可seq,如果可以,它将调用seq将其强制为一个序列,然后它将映射和cat该序列并返回一个序列。您不会返回原始类型的结果


在Scala中,如果您实现IterableLike特性(我认为这是正确的接口),您将得到默认的flatMap实现,这有点像Clojure实现减去对序列的强制。但是,许多类型还提供了flatMap的自定义实现,从而使其具有通用性

你认为收集在clojure中意味着什么?目前,“仅适用于集合”语句似乎非常奇怪,因为我无法想象mapcat(或map偶数)在不能被视为包含多个值的事物上意味着什么。此外,map还可以处理不被视为clojure集合的字符串以及所有集合类型。Clojure不是可选类型的-静态类型检查是可选的(并且不是在核心语言中)但是clojure中没有非类型化的值。同意clojure中的“集合”-这是一个答案,我试图找出更多关于我遗漏了什么的含义:任何对象都可以实现ISeq,然后将成为mapcat的目标。时期他断言mapcat不使用协议是完全错误的。mapcat是根据concat和map实现的,它们都在各自的args上调用seq。seq适用于任何实现ISeq的东西(对于不实现ISeq的Java本机对象有特殊情况)。@noisesmith From:“因此函数f应该返回一个集合。”@noisesmith“我无法想象mapcat(甚至是map)在不能被视为包含多个值的东西上的确切含义”。它是Clojure中
mapcat
map
含义的一部分,但它不是Scala中
flatMap
map
含义的一部分。我并不是说Clojure做了比Scala更糟糕的事情,因为Scala做了这些操作,所以它应该有一个名称,等等。“从文档和示例来看,我看不出有什么功能上的区别。”请看这些示例:“flatMap是List monad中的绑定函数”否,
flatMap
是所有
bind
函数的通用Scala名称。@AlexeyRomanov谢谢,我根据您的评论编辑了我的答案。