惰性评估 - 空间泄漏

2024-01-30

用 Haskell 进行函数式思考 http://www.cambridge.org/us/academic/subjects/computer-science/programming-languages-and-applied-logic/thinking-functionally-haskell提供以下代码来计算mean的列表中的Float's.

mean :: [Float] -> Float
mean [] = 0
mean xs = sum xs / fromIntegral (length xs)

理查德·伯德教授评论道:

现在我们准备看看平均值到底出了什么问题:它存在空间泄漏。评估mean [1..1000]将导致列表在求和后被扩展并保留在内存中,因为有第二个指针指向它,即在计算其长度时。

如果我正确理解这段文字,他的意思是,如果没有指向xs在长度计算中,则xs内存本来可以被释放after计算sum?

我的困惑是 - 如果xs已经在内存中了,不是吗length函数只是要使用已经占用的相同内存吗?

我不明白这里的空间泄漏。


The sum函数不需要将整个列表保存在内存中;它可以一次查看一个元素,然后在移动到下一个元素时忘记它。

因为 Haskell 默认情况下有惰性求值,所以如果你有一个创建列表的函数,sum可以在整个列表不存在于内存中的情况下使用它(每次生产函数生成一个新元素时,它都会被sum然后释放)。

完全相同的事情发生在length.

另一方面,mean函数将列表提供给两者sum and length。所以在评估的过程中sum,我们需要将列表保存在内存中,以便可以通过以下方式处理它length later.

[更新]需要明确的是,该列表最终将被垃圾收集。问题是它的停留时间比需要的时间长。在这种简单的情况下,这不是问题,但在对无限流进行操作的更复杂的函数中,这很可能会导致内存泄漏。

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

惰性评估 - 空间泄漏 的相关文章

  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • 关于“没有绑定的类型签名”的错误

    我在 Haskell 中遇到 ASCII 问题 fromEnum Char gt Int toEnum Int gt Char offset Int offset fromEnum A fromEnum a toUpper Char gt
  • Haskell:需要了解 Functor 的签名

    有人能给我解释一下 Functor 的签名吗 Prelude gt info Functor class Functor f gt where fmap a gt b gt f a gt f b lt a gt f b gt f a 我不明
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看

随机推荐

  • Windows 10 中的 Django 通道安装失败

    这是环境 操作系统 Windows 10 姜戈 2 0rc Python 3 6 点 10 0 0 视觉工作室社区 2017 以及错误消息 running build ext building twisted test raiser ext
  • Android 打开 pdf 不起作用

    一段时间以来我一直在努力让它发挥作用 我在这里看到了有关如何从 Android 打开 pdf 的其他问题 普遍的共识是我下面的代码 我错过了什么吗 try Uri path Uri parse android resource com Te
  • 是否可以增加 CloudFlare 超时?

    是否可以增加 CloudFlare 超时 如果是 怎么办 我的代码需要一段时间才能执行 而且我不打算在未来几天对其进行 Ajax 化 不 CloudFlare 仅提供这种服务企业计划定制 https www cloudflare com e
  • 在Perl中,如何根据绝对位置的条件来计算成功匹配的出现次数

    仅使用onePerl替换或匹配正则表达式语句 如何修改以下代码 我需要修改的值 pattern在下面的代码中 代码将计算在字符串中找到成功匹配的次数 前提是成功匹配的绝对位置满足特定条件 pattern F1 string F1234F12
  • .(点) 访问静态方法

    下面是一个流行的代码 class A public static const string TYPE AEvent const string getType return TYPE 上面的代码可以这样使用 if aInstance getT
  • 使用 POST 方法将参数发送到 url,而不使用表单

    我想使用 POST 方法将参数发布到 URL 但无法使用表单 即使我确实使用了表单 它也必须在没有用户交互的情况下自动发布 这可能吗 我怎样才能做到这一点 Using jQuery post http docs jquery com Aja
  • 不再支持 UITextField -webView

    使用某些文本字段时 我得到以下调试输出 UITextField webView 被调用 新的文本架构不再支持此方法 有人可以解释为什么会出现这种情况吗 我目前正在 iOS 7 上运行 XCode 5 在 iOS 7 之前的以前的 iOS 版
  • VLC 流至 MP4 WEBM 和 Flash

    我正在尝试将视频从 IP 摄像机流式传输到我的 WordPress 网站 我希望我的流可以通过常见设备 Windows Mac Android 和 IOS 访问 目前我正在使用 VLC 进行流式传输 但我只能使用 flash 流 但我想做
  • 使用 LINQ 搜索关键字

    如果我有一个包含标题的文本字段 并且有一个关键字列表 我如何搜索标题并检查标题中的 n 个关键字 因此 如果我的标题是 烘焙鸡肉 培根和韭菜派 并且用户搜索 鸡肉培根萝卜 我想返回上述食谱 本质上我想说的是 如果标题包含 2 个或更多搜索词
  • Vuetify V-Data-Table 页脚添加按钮

    我想在 v data table 页脚中添加一个与此图像类似的按钮 问题是 如果表包含数据 我通常可以添加一个按钮 但是 如果没有数据 则该按钮不会呈现 这是代码
  • Grails 获取子域对象

    我有两个域类 一个是父域类 另一个是子域类 它们之间有一个 hasMany 关系 父类有很多子类 子类属于父类 这是编码示例 class Parent String name static hasMany childs Child stat
  • 以编程方式更新 MSI 属性

    我需要一个解决方案 希望它应该相当简单 更新 MSI 属性 我们有许多在 TFS 2012 中进行源代码控制的 WiX 项目 并且我们生成其相关的 MSI 以便通过 TeamCity 构建配置进行部署 这些配置通常会构建所需的 wixpro
  • Access SQL 中的逆透视

    大家好 我正在尝试在 MS Access 上的 SQL 中使用 unpivot 我在网上找到了以下代码 SELECT CustomerID Phone FROM SELECT CustomerID Phone1 Phone2 Phone3
  • Jenkins 使用变量 ${GIT_BRANCH} 作为 sonarqube 参数(不带“origin/”)进行构建

    大型团队 每个团队都有单独的 git 分支 并使用声纳作为代码质量检查器 scm 工具设置为选取与该名称对应的每个分支 feature branch 对于 Maven 构建来说 它工作得很好 我想设置 sonarqube 这样它就会为每个实
  • Angularjs $http post 文件和表单数据

    我在 python 中有以下请求 import requests json io cookie payload Name abc url test file out test json fi file file open file r re
  • 如何在 Python 中将十六进制转换为十进制? [复制]

    这个问题在这里已经有答案了 我有一些 Perl 代码 其中 hex 函数将十六进制数据转换为十进制 我怎样才能做到Python http en wikipedia org wiki Python 28programming language
  • “连续两项”错误

    我正在尝试编写如下紧凑的行 代码是从使用动态作用域特殊变量 IN 读取 STDIN 的脚本中提取的 你能告诉我如何正确地写这一行吗 这有效 for IN lines last when say VERBOSE is the string i
  • BASH 复制除一个之外的所有文件

    我想将除名为 Default png 的文件之外的所有文件复制到目录之外 似乎有很多方法可以做到这一点 什么对你来说最有效 应如下所示 cp r Default png dest 如果复制到嵌套在当前文件夹中的文件夹 在下面的情况下称为示例
  • 类型错误:r.getClientRects 不是函数

    我正在尝试按照以下链接在 KendoUI 网格中创建自定义工具栏 http demos telerik com kendo ui grid toolbar template http demos telerik com kendo ui g
  • 惰性评估 - 空间泄漏

    用 Haskell 进行函数式思考 http www cambridge org us academic subjects computer science programming languages and applied logic t