在Haskell中真正导入了什么

Sve*_*mir 3 import haskell

也许这是一个有点愚蠢的问题,但我已经习惯了脚本语言,问题永远不会发生,因为根本就没有编译.问题是:真正导入到Haskell可执行文件的是什么:是整合了整个导入的库还是只在可执行文件中包含了运行程序真正需要的代码?

假设我有类似的东西:

import qualified Data.Set as Set

mySet = Set.fromList [1..5]

main = print $ Set.filter (\x -> x `mod` 2 == 0) mySet
Run Code Online (Sandbox Code Playgroud)

整个Data.Set模块是否包含在可执行文件中?或者它只包括Set定义fromListfilter功能?如果我写的话会有什么不同:

import qualified Data.Set as Set (Set, fromList, filter)
Run Code Online (Sandbox Code Playgroud)

至少可执行的大小似乎不会受到更改的影响......

Ørj*_*sen 8

除非已使用GHC -split-objs选项编译,否则库模块将作为整体链接.但是这会使编译速度变慢,因此它不是默认值.来自GHC文档:

但是,单独组装所有部分是昂贵的,因此这比正常编译要慢.我们使用此功能来构建GHC的库(警告:除非您知道自己在做什么,否则不要使用它).