Haskell:模块导入带来不必要的二进制增长

2023-11-21

当我通过以下方式之一将(大)模块导入主模块时:

import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)

与我不导入该模块时相比,编译后的二进制文件增长了同样巨大的数量。无论我是否在该模块中使用任何内容,或者不在主模块中使用任何内容,都会发生这种情况。编译器(我在 Debian 测试中使用 GHC)不应该只在二进制文件中添加运行它所需的内容吗?

在我的具体情况下,我的模块中有一个巨大的地图,我不在主模块中使用它。有选择地导入我真正需要的内容,并没有改变编译后的二进制文件的增长。


就 GHC 而言,导入列表只是为了可读性和避免名称冲突;它们根本不影响链接的内容。

此外,即使您只从库中导入了一些函数,它们可能仍然依赖于库内部的大部分函数,​​因此您不一定期望看到仅使用一些可用接口的大小会减小。

默认情况下,GHC 链接整个库,而不仅仅是您使用的部分;您可以通过使用以下命令构建库来避免这种情况-split-objsGHC 选项(或将split-objs: True在你的 cabal-install 配置文件中(~/.cabal/config在 Unix 上)),但它会减慢编译速度,并且 GHC 开发人员似乎不推荐:

-split-objs

告诉链接器将通常生成的单个目标文件拆分为多个目标文件,每个顶级 Haskell 函数或模块中的类型一个。这仅对库有意义,这意味着链接到库的可执行文件更小,因为它们只链接到它们需要的目标文件。然而,单独组装所有部分的成本很高,因此这比正常编译要慢。此外,库本身(.a 文件)的大小可能大 2 到 2.5 倍。我们使用此功能来构建 GHC 的库。

GHC 手册

无论导入什么内容,这都会忽略您使用的库中未使用的部分。

您可能还有兴趣使用共享 Haskell 库.

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

Haskell:模块导入带来不必要的二进制增长 的相关文章

  • 如何处理“恐慌:不可能的事情发生了”并在 Haskell 中继续

    我有以下代码 它使用 GHC API 加载模块并获取表达式的类型 typeObjects String gt String gt IO Type typeObjects modules objects do defaultErrorHand
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • 嵌套在其他 monad 中的 IO 操作未执行

    我有一个 foobar IO ParseResult String String ParseResult 是一个在这里定义的 monad https hackage haskell org package haskell src exts
  • 如何处理在组合下发生变化的类型?

    我最近读了一篇非常有趣的论文单调性类型 https infoscience epfl ch record 231867 files monotonicity types pdf其中描述了一种新的 HM 语言 该语言可以跟踪操作之间的单调性
  • Haskell 和 Idris 之间的区别:类型宇宙中运行时/编译时的反映

    因此 在 Idris 中 编写以下内容是完全有效的 item b Bool gt if b then Nat else List Nat item True 42 item False 1 2 3 cf https www youtube
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 简单的秒差距示例会产生类型错误

    我正在尝试编译这个简单的秒差距代码 import Text Parsec simple letter 但我不断收到此错误 No instance for Stream s0 m0 Char arising from a use of let
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • 有 Haskell 日期库吗?

    Haskell 中是否有一个函数允许我输入日期的组成部分 如字符串表示形式或日月年组成部分 我可以从中获取信息 如星期几 一个月中的天等 我在网上查了一下 看起来有很多自定义库 但我希望 ghci 10 6 4 的标准前奏库中有一个没有很好
  • 为什么我的 Haskell 断言只发生在 IHaskell 中?

    如果我定义 import Control Exception assert import Data Char ord f String gt String f s assert all elem letters s letters lt g
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变
  • enumFromTo 如何工作?

    我无法将号码添加到Char 以下内容将无法编译 a 1 但是 a z 成功创建一个字符串 其中每个字符值都会递增 有没有一个特殊的函数可以增加Char 我知道我能做到chr ord c 1 如何 a z 或底层enumFromTo函数增加结
  • Haskell 中是否可以部分应用第 n 个参数?

    我很好奇是否可以写一个函数apply nth它接受一个函数 参数的数量以及该参数的值 然后返回一个新的 部分应用的函数 我的感觉是 由于类型系统的原因 这是不可能的 但我无法给出令人满意的答案 我也无法提出工作类型签名 如果语言的类型更加松
  • 优化计算 200 万以下所有素数总和的 Haskell 代码

    欧拉计划中的问题 10 我在那里看到了一些讨论 但仅限于 C 我用下面的代码来计算 print sum sieve 2 2000000 where sieve sieve x xs x sieve filter 0 mod x xs 需要很
  • Haskell - 让函数返回空字符

    我正在尝试创建一个函数来删除字符串中的每个第 n 个元素 dropEvery String gt Int gt String dropEvery str n map char indx gt if indx mod n 0 then cha
  • 为什么阴谋集团重新安装“总是危险的”?

    使用 Cabal 重新安装软件包时 通常会看到以下警告 警告 请注意 重新安装总是很危险的 无论如何继续 此消息背后的一些原因是什么 目前 重新安装软件包意味着破坏性地覆盖已安装的软件包 如果旧包对系统有任何反向依赖性 它们将不再工作 为了
  • 如何编写将布尔值返回到一个函数的函数

    我在这里发现了一个类似的问题 它问了几乎相同的问题 但又不完全一样 我的问题是如何将 a gt Bool 类型的函数列表组合成一个也是 a gt Bool 的函数 Ex compose a gt Bool gt a gt Bool comp
  • 追踪 Haskell 中的错误

    我如何获得有关 Haskell 错误发生位置的更多信息 例如 昨天我正在开发一个 Haskell 程序 该程序解析输入文件 转换数据 然后打印出报告信息 有一次 我跑了 main 然后回来了 Prelude read parse error
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr

随机推荐

  • 单个 CALayer 可以用作多个其他层的掩模吗?

    我在文档中找不到任何指示单个 CALayer 或子类 是否可以用作mask多个其他层的属性 是否可以 还是未定义 我的实验表明不能 它将最终作为其附加到的最后一个图层的蒙版 并且它被指定为蒙版的任何先前图层都将恢复为蒙版的默认值
  • 在 xcode 4.6 中从命令行设置 #define

    我试图在使用 xcodebuild 进行命令行构建时设置 define 宏 但没有运气 我试过了 DMYMACRO 1 and MYMACRO 1我能想到的一切都不起作用 如何从命令行设置 define Roger 您正在寻找的是一种通过命
  • RSA 加密然后解密失败,并显示“oaep 解码错误”

    我正在尝试调试一个简单的 openssl 程序 但无法完全理解 openssl 的 oaep 解码错误 含义 我已将我的程序简化为这个 测试 一个 include
  • 当 isNameSpaceAware 和 isValidating 为“true”时,XPath 对“Node”返回 null

    当我尝试解析 XML 文件时 我得到一个空节点 XPath xPath XPathFactory newInstance newXPath Node node null try node Node xPath evaluate mynode
  • 是否有任何原生 PHP 函数会抛出内置异常?

    回答的同时PHP rename 不会在错误时抛出异常我想知道是否有任何本地 PHP 函数会抛出内置的例外 旁边SPL stuff PDO 可以配置为抛出异常
  • 添加到 HTML 表单而不丢失 Javascript 中当前表单输入信息

    我有一个下拉菜单 它根据所选的选择构建一个表单 因此 如果有人选择 foobar 它会显示一个文本字段 如果他们选择 cheese 它会显示单选按钮 然后 用户可以在这些表单中输入数据 唯一的问题是 当他们添加新的表单元素时 所有其余信息都
  • struct.error:所需参数不是整数

    我有以下 python 代码 velocity 0 rotation 0 vr velocity rotation 2 vl velocity rotation 2 cmd struct pack gt Bhh 145 vr vl 我正在处
  • 如何限制对 ASP.net MVC 控制器中某些操作的访问

    我是 ASP net MVC 的新手 并使用它创建了我的第一个 Web 应用程序 在我的应用程序中 我使用数据库身份验证 我在控制器中创建了登录操作 该操作检查输入的用户名和密码是否存在于数据库中 如果存在 则将所需的值放入会话中 并根据用
  • 使用用户帐户凭据访问私有 Cloud Run/Cloud Functions

    这是我的用例 我已经以私有模式部署了 Cloud Run 服务 与云功能相同的问题 我正在开发一项使用此 Cloud Run 的新服务 我使用应用程序中的默认凭据进行身份验证 它适用于 Compute Engine 和 Cloud Run
  • android挂起意图通知问题

    我的应用程序中有一个警报 它会启动一个通知 然后在按下时启动一个活动 问题是 当我创建多个警报时 从通知启动的活动将获得与第一个警报相同的额外内容 我认为问题要么在于我放入待决意图中的意图 要么在于待决意图本身 我想我可能需要在其中一个上挂
  • 如何在 OS X Yosemite 上的 Apache 2.4 中安装 mod_perl 2.0.9?

    随着 OS X 10 10 Yosemite 的发布 Apple 将其 Apache 服务器升级到了 2 4 版本 发布时 mod perl 2 0 8 与 Apache 2 4 不兼容 mod perl 2 0 9 尚未正式发布 更多信息
  • 模拟本地主机上的慢速互联网连接

    我使用 c asp net 和 iis 我想在我的电脑上模拟慢速互联网连接来测试我的应用程序 我可以控制iis的带宽吗 请不要建议 System Threading Thread Sleep someDuration 在 c 文件中 您可以
  • Android 图像捕捉时内存不足

    我有一个拍摄照片的活动 具有全部可能的分辨率 因此相当大 应用程序有机会分析它们 一次仅处理一张照片 问题是我在拍了 4 5 张照片后遇到了 内存不足 的情况 我懂了 dalvikvm heap 5070745 字节分配内存不足 字节大小不
  • 如何使用 Float(在打印样式表中)修复此打印布局?

    我有一个页面 其中包含网格格式的多个图表 如下所示 每个图表都显示在一个包装中float left图表所在的 div 有overflow auto 这给出了将图表包裹到屏幕宽度的所需布局 我遇到的问题是 在打印模式下 这只打印一页并丢失其余
  • TableView 就像 iPhone 中的通讯录应用程序

    嘿 我正在开发一个联系人应用程序 我想要具有相同类型的 Tableview 和添加按钮 因此 当用户添加新联系人时 它将打开一个新视图 其中包含标准按钮和文本字段等 如何使应用程序向每个新视图添加相同的功能 我希望这是有道理的 先感谢您 这
  • 包括 javascript 到 google 网站

    我试图在 Google 协作平台中包含一个简单的 javascript 但按下按钮时我什么也没得到 我将代码放入 HTML 框中 该代码在本地测试时完美运行 这是我的代码
  • 如何使用 ArrayList 正确实现 Parcelable?

    我在上课时遇到困难Parcelable 问题是 我正在尝试向包裹中的一个成员写信 该成员是ArrayList
  • 与R语言匹配以获得位置

    我使用 match 来获取元素是否在列表中 例如我的清单是 c a b h e and so on 如果我想查看元素 h 是否在列表中 我可以这样使用 match if h in v do something 如何获取列表中找到元素的位置
  • Firestore 安全规则:仅当新文档 ID 与用户 ID 相同时才允许用户创建文档

    当用户第一次登录时 我还需要调用一个函数 在我的 firestore 用户集合中创建一个文档来存储他们的个人资料数据 使用Web SDK 我之前使用带有 firebase 函数的新用户触发事件 但等待冷函数启动的速度太慢 安全规则要求 需要
  • Haskell:模块导入带来不必要的二进制增长

    当我通过以下方式之一将 大 模块导入主模块时 import Mymodule import qualified Mymodule as M import Mymodule MyDatatype 与我不导入该模块时相比 编译后的二进制文件增长