haskell - Clojure 中的 mapcat 和 Haskell 中的 concatmap 有什么区别?

标签 haskell map clojure concat flatmap

在 Clojure 中有一个名为 mapcat 的函数在 Clojure 中,它与 flatmap in Scala 有一些相似之处.是used to map a function to a list并返回一个列表。

在 Haskell 中,我们有一个函数 ConcatMap其名seems quite similar .

我的问题是 - Clojure 中的 mapcat 和 Haskell 中的 concatmap 有什么区别?

最佳答案

concatMap在 Haskell 中有类型 concatMap :: (a -> [b]) -> [a] -> [b]而 Clojure 的 mapcat ,如果它有任何类型,就必须复杂得多。初步近似,我们可以写

mapcat :: (Collection c, Collection c') => (a -> c' b) -> c a -> [b]

虽然,技术上 mapCat继承map的动态参数列表,因此根本无法在 Haskell 中输入,但如果可以,它可能看起来像
mapcat :: (forall c . Collection c => a -> ... -> c b) 
       -> [forall c . Collection c => c a]
       -> [b]

强调如何动态 mapCat可能是,尽管仍然不如实际动态。也就是说,如果我们 promise 只将一个惰性序列传递给 mapcat那么它与 concatMap 相同并且具有几乎完全相同的代码
concatMap f s = concat (map f s)

(defn mapcat [f coll] (concat (map f coll)))

也就是说,在 Haskell 中没有人使用 concatMap ,他们使用 (>>=) (或列表推导式,如果需要,可以翻译成 (>>=))。
-- flipped for consistency
flip (>>=) :: Monad m => (a -> m b) -> m a -> m b

原来(>>=)输入的多态性仍然低于 mapcat ,但是 (>>=)也是输出多态。这使它具有更多的语义多样性。您并不总是从集合中提取值,将答案压缩到结果列表中,然后将这些结果粘合在一起。相反,您可能会将延续函数传递到非确定性并行编排过程中。或者排序解析器,其中第二个依赖于第一个的输出。或者传播一个有状态的环境。

关于haskell - Clojure 中的 mapcat 和 Haskell 中的 concatmap 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20782258/

相关文章:

haskell - 包含函数的数据类型的仿函数实例

haskell - 是否可以在派生 Generic 的记录数据类型中列出字段的名称和类型?

ios - Cocos2D 可以实现动态瓦片 map 吗?

c# - Windows 应用商店应用程序的免费映射组件?

haskell - Haskell 中的镜头与 Clojure 中使用按键序列之间有哪些异同?

haskell - 如何处理 Haskell 中 createProcess 的错误?

haskell - 像 sdl-config 这样的配置工具如何与 cabalized 项目一起使用?

java - 是否有在 Java 中编写 map 文字样式的最佳实践?

Clojure JVM 7/8 改进

java - 管理元编程(AOP/反射/宏)技术复杂性的实践