haskell - GHC 会剔除未使用的导入吗?

标签 haskell ghc

当我不使用 main 函数中的某些导入(应该很容易检测到)时,GHC 会删除相应的绑定(bind)吗?

示例:

import Text.Parsec (parse)
import My.Testframework (test)

main = parse …

tests = test …

My.Testframework 会链接到可执行文件中吗?

最佳答案

我做了这个简单的测试:

import Data.Map as M
import Data.Text as T

main = do
  let m = M.fromList [(1, 2), (3, 4)]
  putStrLn $ show m

得到:

$ ghc imports.hs
$ $ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1583112 May 17 10:56 imports
<小时/>

然后我注释掉了未使用的 Data.Text 导入:

import Data.Map as M
-- import Data.Text as T

main = do
  let m = M.fromList [(1, 2), (3, 4)]
  putStrLn $ show m

得到了这个:

$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1583112 May 17 10:56 imports

没有任何改变,所以我必须假设 Data.Text 已经被忽略,因为它没有被使用。

<小时/>

然后我尝试了另外 2 个变体。

保留 Data.Map 导入和 fromList 调用,但不使用 m 中的值:

import Data.Map as M
-- import Data.Text as T

main = do
  let m = M.fromList [(1, 2), (3, 4)]
  putStrLn "hello"

这让我:

$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1505292 May 17 10:56 imports
<小时/>

然后我还使用 fromList 删除了 m 的构造:

import Data.Map as M
-- import Data.Text as T

main = do
  putStrLn "hello"

这让我:

$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1505284 May 17 10:56 imports

——大小几乎没有变化。

所以我的解释是,即使您导入一个库并表面上使用它,但使用本身未被使用,GHC 也不会链接未使用导入的库。

关于haskell - GHC 会剔除未使用的导入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281541/

相关文章:

haskell - 我可以使用一元操作从 Control.Lens 中过滤 Fold 吗?

haskell - 有没有更好的方法来编写indexof函数?

linux - 为什么 `stack --version` 显示的版本与安装的版本不同?

haskell - fmap 如何与数据构造函数一起使用?

linux - 有没有办法告诉 GHC 将所有警告转储到文件中?

c# - 在C#中使用高阶Haskell类型

haskell - 让 GHC 接受带有 KnownNat 算术的类型签名

multithreading - GHC 的 thunk 有多原子?

arrays - 如何正确优化 MArray 函数以提高速度?

exception - 懒惰和异常如何在 Haskell 中协同工作?