GHC 会剔除未使用的进口产品吗?
Will GHC strip out unused imports?
当我不使用 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
然后我注释掉了未使用的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 不会 link 导入未使用的库。
当我不使用 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
然后我注释掉了未使用的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 不会 link 导入未使用的库。