concatMap f xs 和 concat $map f xs 之间的区别?

2023-11-26

想必他们做的是完全相同的事情concatMap f xs and concat $ map f xs。我为什么要选择其中之一而不是另一个?

我想这可能是一种优化。如果是这样,GHC 7.8 仍然是这种情况吗?


情况是这样的concatMap f xs = concat (map f xs)正如你所怀疑的。因此,为了正确性,您应该认为它们是可以互换的。不过,我们可以检查它们的定义以了解更多信息。

concatMap               :: (a -> [b]) -> [a] -> [b]
concatMap f             =  foldr ((++) . f) []

concat :: [[a]] -> [a]
concat = foldr (++) []

特别是,这意味着concat . map f扩展到foldr (++) [] . map f。现在使用一种称为“普遍财产fold"我们可以看到foldr g z . map f = foldr (g . f) z对于任何(g, z, f)例如选择((++), f, [])我们在上面使用。这表明concatMap f = concat . map f就像我们想要的那样。[0]

那么为什么它们的定义不同呢?因为foldr ((++) . f) []总是会比foldr (++) [] . map f因为,在真正病态的情况下,后者建议两个单独的递归。然而,由于懒惰,不太可能执行两次递归,那么会出现什么情况呢?

真正的原因是有更复杂的聚变定律可供编译器使用,例如组合两个顺序的编译器foldrs 或 定义之间的相互作用foldr and unfoldr。这些使用起来有点挑剔,因为它们依赖于能够查看代码片段的表面语法并检测可能的简化。 Alot制定持续发射聚变定律的工作量很大。

但我们可以做的一件事是鼓励人们使用预先应用优化定律的高阶组合器。自从foldr (++) [] . map f永远不会比foldr ((++) . f) []我们可以走捷径,预先应用普遍法则简化。这将提高融合法则在其他地方启动的可能性,以最好地优化列表生成管道。

[0] 这条法律为何有效?粗略地说,普遍规律是foldr指出如果你有任何功能q这样q [] = z and q (a:as) = f a (q as)然后q must be and is foldr f z. Since q = foldr g z . map f可以证明有q [] = z and q (a:as) = g (f a) (q as)然后它must be像折叠一样foldr (g . f) z就像我们想要的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

concatMap f xs 和 concat $map f xs 之间的区别? 的相关文章

  • Haskell,范围缩小到无步骤[重复]

    这个问题在这里已经有答案了 为什么在 Haskell 中工作范围不能降低到没有步骤 7 1 gt 但只工作这个 7 6 1 gt 7 6 5 4 3 2 1 Haskell 无法知道您想要执行 1 除非您给出提示 在某些情况下 您可能需要一
  • 不同 hs 文件中的函数分离时堆栈空间溢出

    我有一个巨大的 haskell 文件 它编译和运行没有任何问题 我想将一些函数和类型定义放在通用 hs 文件中的单独模块中 然后将其导入我的主模块中 虽然主程序编译时没有任何错误 它还编译导入的模块 但当我尝试运行它时 出现堆栈空间溢出 I
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • Haskell 中的常量变量声明

    要声明常量变量 我可以在 Ruby 中执行以下操作 class COLOR RED 10 BLUE 20 GREEM 30 end COLOR RED回报10 COLOR BLUE回报20 等等 我如何在 Haskell 中实现这一点 我想
  • 'lens' 的阴谋集团依赖性解析失败

    我刚刚做了一个阴谋更新并尝试从 hackage 安装 lens 这给了我以下错误 cabal install j lens Resolving dependencies Configuring dlist 0 7 0 1
  • 为什么haskell中的递归列表这么慢?

    我对 Haskell 很陌生 我在 Haskell 中定义了一个函数 febs Integral a gt a gt a febs n n lt 0 0 n 1 1 n 2 1 otherwise febs n 1 febs n 2 但是
  • 将 Either 列表转换为其中包含列表的 Either 列表

    我是 Haskell 的初学者 我正在编写一些使用 Haskell 的代码Either https hackage haskell org package base 4 9 0 0 docs Data Either html用于错误处理 E
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • 将名称绑定到值与将值分配给变量

    阅读 Bartosz Milewski 的文章完整的 https www fpcomplete com school starting with haskell basics of haskell 3 pure functions lazi
  • Haskell 类型定义,=> 等

    我正在使用 Learn You a Haskell 来学习 Haskell 第 54 页上有一个 像这样执行 take Num i Ord i gt i gt a gt a take n n lt 0 take take n x xs x
  • Haskell:GHC 无法推断类型。由类型签名错误绑定的刚性类型变量

    我看过几篇主题相似的帖子 但它们并不能真正帮助我解决我的问题 所以我才敢重复 现在我有一个带有签名的函数 run Expr query gt RethinkDBHandle gt query gt IO JSON 这是一个数据库查询运行函数
  • Haskell cabal:我刚刚安装了软件包,但现在找不到软件包

    在这里 http haskell org haskellwiki Cabal Install I just installed packages 2C but now the packages are not found这是我可以找到我正在
  • 动态加载编译的 Haskell 模块 - GHC 7.6

    我正在尝试使用 GHC API 动态编译和加载 Haskell 模块 我知道 API 从一个版本到另一个版本波动很大 所以我专门谈论 GHC 7 6 我尝试在 MacOS 和 Linux 上运行相同的代码 在这两种情况下 插件模块都可以正常
  • 为什么我不能将 Int 类型与 a 类型匹配

    哈斯克尔新手在这里 我在这里尝试做的事情的一个过于简单的例子 test Int gt a test i i Couldn t match expected type a with actual type Int a is a rigid t

随机推荐

  • 在哪里可以找到 TensorFlow 2.0 的tensorflow.contrib.layers

    我一直在 TensorFlow 中开发机器学习代码contrib layers 我对这个模块很满意 它工作得很好 让我能够充分控制我的模型 然而 TensorFlow 2 0将完全删除contrib模块和新的keras模块在没有额外努力的情
  • 以编程方式获取页面的屏幕截图

    我正在编写一个供内部使用的专用爬虫和解析器 并且我需要能够截取网页的屏幕截图 以便检查整个过程中使用的颜色 该程序将接收大约十个网址并将它们保存为位图图像 从那里我计划使用 LockBits 来创建图像中最常用的五种颜色的列表 据我所知 这
  • 使用分页查看目录中的文件 - php

    我想在浏览器中显示我的目录中的文件 我知道这可以使用 opendir and readdir 但我想要的是将列表中的文件数量限制为特定数量并使用分页显示下一个 你可以使用scandir将目录的所有内容读入数组 然后根据分页值输出数组的内容
  • isInstance 和 isInstanceOf 之间的区别

    之间有区别吗classOf String isInstance 42 and 42 isInstanceOf String 如果是 你能解释一下吗 对于引用类型 那些扩展AnyRef 最终结果没有区别 isInstanceOf然而 我们非常
  • KafkaStreams:获取窗口最终结果

    是否可以得到窗口最终结果在 Kafka Streams 中通过抑制中间结果 我无法实现这个目标 我的代码有什么问题吗 val builder StreamsBuilder builder stream
  • 导入 CSV 文件时如何删除文本周围的双引号?

    我有类似于以下内容的数据 D STEIN DS 01 ALTRES TTTTTTFFTT D STEIN DS 01 APCASH TTTTTTFFTT D STEIN DS 01 APINH TTTTTTFFTT D STEIN DS 0
  • 使用 java nio 路径时未安装 JBoss wildfly 8.x 提供程序“vfs”

    我正在尝试将 spring 应用程序从 glassfish 4 导出到 JBoss wildfly 8 x 或 9 alpha 但是当我的应用程序在代码的某些部分启动时会引发异常 Caused by java lang RuntimeExc
  • e.srcElement 在 Firefox 中未定义?

    我正在开发一个网站 现在正在所有浏览器中进行测试 我目前正在 firefox 中进行测试 并且在使用 event sourceElement 时发现错误 我需要 e srcElement 做的是返回值 下面我展示了一个关于如何获取返回的值
  • 关于太多开放数字的警告

    在我创建许多人物的脚本中fix ax plt subplots 我收到警告运行时警告 已打开超过 20 个数字 通过 pyplot 接口创建的图形 matplotlib pyplot figure 会保留到显式关闭为止 并且可能会消耗太多内
  • 在 Web api 控制器中手动验证模型

    我有一个名为 用户 的类和一个属性 名称 public class User Required public string Name get set api控制器方法是 public IHttpActionResult PostUser U
  • @PathVariable 和 @ModelAttribute 的值重叠

    我有一个User存储在会话中的对象 SessionAttributes 以及一个直接的方法装饰 ModelAttribute以便在会话值为空时初始化它 用户类别 Entity Table name USER public class Use
  • 实现包含其他 Parcelable 的 Parcelable 时出现问题

    我正在实现 Parcelable 类 其中有另一个 Parcelable 在 OuterParcelable 类中 Override public void writeToParcel Parcel dest int flags Bundl
  • UnicodeDecodeError,utf-8 无效的连续字节

    我正在尝试使用该代码从日志文件中提取行 with open fichier 01 as f content f readlines print content 但它总是发出错误声明 Traceback most recent call la
  • Python 子进程 readlines() 挂起

    我尝试完成的任务是流式传输 ruby 文件并打印输出 NOTE 我不想一次打印出所有内容 main py from subprocess import Popen PIPE STDOUT import pty import os file
  • 在 WPF 中比较两个位图图像以检查它们是否不同的最快方法

    比较 2 个 BitmapImage 对象的最快方法是什么 一个位于 图像源 属性中 另一个是我在代码中创建的 我可以使用新的位图图像设置图像源 但它会导致闪烁 因为它会一遍又一遍地设置相同的图像 我只想在图像像素与 Image Sourc
  • ZEND,用数据渲染不同的视图

    我有一个问题 因为我想从不同的控制器渲染视图并传递数据 你知道该怎么做吗 我正在尝试 this gt renderScript index index phtml gt entries result 但我的如果 if count this
  • 当父元素为 display:none 时显示 HTML 子元素

    当父元素为 display none 时 是否有任何机制可以显示子元素 这种情况是隐藏选项卡上的验证错误 我想显示错误消息 即使该字段是隐藏的 这里是一个真正简化的 JSFiddle 情况http jsfiddle net vLYnk Ma
  • 如何在 SBT 中切换项目和库依赖关系?

    在 SBT 中声明托管库依赖关系很容易 例如 libraryDependencies Seq org specs2 specs2 1 12 2 test junit junit 4 7 test 虽然在 SBT 中声明项目依赖关系并不那么容
  • 在 iOS 上同时录制和播放(Phonegap 版本)

    我正在使用 Phonegap Build 版本 3 3 0 开发 iOS 和 Android 应用程序 应用程序的主要焦点是录音 并在后台播放另一个音频 音乐 对于这两种情况 我都使用phonegap媒体api和正确的音频文件进行录制 iO
  • concatMap f xs 和 concat $map f xs 之间的区别?

    想必他们做的是完全相同的事情concatMap f xs and concat map f xs 我为什么要选择其中之一而不是另一个 我想这可能是一种优化 如果是这样 GHC 7 8 仍然是这种情况吗 情况是这样的concatMap f x