GHC会剥离未使用的进口产品吗?

Pro*_*sch 4 haskell ghc

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

例:

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

main = parse …

tests = test …
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*lun 5

我做了这个简单的测试:

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

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

得到了:

$ ghc imports.hs
$ $ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1583112 May 17 10:56 imports
Run Code Online (Sandbox Code Playgroud)

然后我注释掉了未使用的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
Run Code Online (Sandbox Code Playgroud)

得到了这个:

$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1583112 May 17 10:56 imports
Run Code Online (Sandbox Code Playgroud)

什么都没有改变,所以我必须假设Data.Text已被忽略,因为它未被使用.


然后我又尝试了两个变种.

离开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"
Run Code Online (Sandbox Code Playgroud)

这让我:

$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1505292 May 17 10:56 imports
Run Code Online (Sandbox Code Playgroud)

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

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

main = do
  putStrLn "hello"
Run Code Online (Sandbox Code Playgroud)

这让我:

$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1505284 May 17 10:56 imports
Run Code Online (Sandbox Code Playgroud)

- 尺寸几乎没变.

因此,我的解释是,即使您正在导入库并在表面上使用它,但使用本身未使用,GHC也不会链接其导入未使用的库.