When I don’t use certain imports from the main function (which should be easily detectable), will GHC strip out the corresponding bindings?
Example:
import Text.Parsec (parse)
import My.Testframework (test)
main = parse …
tests = test …
Will My.Testframework be linked in the executable?
I did this simple test:
import Data.Map as M
import Data.Text as T
main = do
let m = M.fromList [(1, 2), (3, 4)]
putStrLn $ show m
and got:
$ ghc imports.hs
$ $ ls -l imports
-rwxr-xr-x+ 1 erik staff 1583112 May 17 10:56 imports
I then commented out the unused Data.Text import:
import Data.Map as M
-- import Data.Text as T
main = do
let m = M.fromList [(1, 2), (3, 4)]
putStrLn $ show m
and got this:
$ ghc imports.hs
$ ls -l imports
-rwxr-xr-x+ 1 erik staff 1583112 May 17 10:56 imports
Nothing changed, so I must assume Data.Text was already ignored since it was unused.
I then tried 2 more variants.
Leaving in the Data.Map import and the fromList call, but not using the value in m:
import Data.Map as M
-- import Data.Text as T
main = do
let m = M.fromList [(1, 2), (3, 4)]
putStrLn "hello"
which got me:
$ ghc imports.hs
$ ls -l imports
-rwxr-xr-x+ 1 erik staff 1505292 May 17 10:56 imports
I then also removed the construction of m using fromList:
import Data.Map as M
-- import Data.Text as T
main = do
putStrLn "hello"
which got me:
$ ghc imports.hs
$ ls -l imports
-rwxr-xr-x+ 1 erik staff 1505284 May 17 10:56 imports
— the size barely changed.
So my interpretation is that even if you're importing a library and using it superficially, but the use itself is unused, GHC will not link libraries whose imports are unused.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With