也许这是一个有点愚蠢的问题,但我已经习惯了脚本语言,问题永远不会发生,因为根本就没有编译。问题是:真正导入到Haskell可执行文件的内容是:是整合了整个导入的库还是只在可执行文件中包含了运行程序所必需的代码?
假设我有类似的东西:
import qualified Data.Set as Set
mySet = Set.fromList [1..5]
main = print $ Set.filter (\x -> x `mod` 2 == 0) mySet
整个Data.Set
模块是否包含在可执行文件中?或者它只包含Set
定义以及fromList
和filter
函数?如果我写的话会有什么不同:
import qualified Data.Set as Set (Set, fromList, filter)
至少可执行文件大小似乎不会受到更改...
答案 0 :(得分:8)
库模块作为一个整体链接,除非它已使用GHC -split-objs
选项进行编译。但是这会使编译速度变慢,因此它不是默认值。来自GHC documentation:
然而,单独组装所有部分是昂贵的,因此这比正常编译慢。我们使用此功能来构建GHC的库(警告:除非您知道自己在做什么,否则不要使用它。)。
答案 1 :(得分:3)
通过使用import
,您只需将一些定义纳入范围。
从库中调用函数是链接器的工作。该库仍然相同,您的代码只包含对它的调用。
答案 2 :(得分:1)
我认为整个图书馆都会被收录。但正如您正确指出的那样,库的某些部分不会直接或间接调用。我相信,编译器的代码优化阶段将删除未调用的代码部分。这应该导致最终的可执行文件只包含那些绝对必要的部分。