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

 手机用户2502926207 发布于 2023-02-08 10:00

在Clojure中,你在Clojure中有一个名为mapcat的函数,它与Scala中的flatmap有一些相似之处.它用于将函数映射到列表并返回列表.

在Haskell中,我们有一个函数ConcatMap,它的名字看起来非常相似.

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

1 个回答
  • 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可能如何,尽管仍然不如实际动态.也就是说,如果我们承诺只传递一个懒惰的seq,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,但(>>=)也是输出多态的.这使它具有更多的语义变化.您并不总是从集合中排出值,将答案压缩到结果列表中,然后将这些结果粘合在一起.您可能会将延续函数传递给非确定性并行编排过程.或者对解析器进行排序,其中第二个取决于第一个的输出.或传播有状态的环境.

    2023-02-08 10:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有