Haskell GHC是否会剔除未使用的进口?

Haskell GHC是否会剔除未使用的进口?,haskell,ghc,Haskell,Ghc,当我不使用main函数中的某些导入时(应该很容易检测到),GHC会去掉相应的绑定吗 例如: 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.fromLis

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

例如:

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

然后我注释掉了未使用的
数据。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.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
$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1505284 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  1505292 May 17 10:56 imports
$ ghc imports.hs 
$ ls -l imports
-rwxr-xr-x+ 1 erik  staff  1505284 May 17 10:56 imports
-尺寸几乎没有变化


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

我建议使用显式的
模块Main(Main),其中
,以确保导入不会重新导出,这将强制链接。@chi
modulemain(Main),其中
是默认值。