Search code examples
haskelltemplate-haskell

Template Haskell compile error when calling with different parameters


Why does the following fail to compile (on GHC 7.4.2)?

{-# LANGUAGE TemplateHaskell #-}

f1 = $([| id |])

main = print $ (f1 (42 :: Int), f1 (42 :: Integer))

Note that the following compiles fine:

{-# LANGUAGE TemplateHaskell #-}

f1 = id -- Don't use template Haskell here.

main = print $ (f1 (42 :: Int), f1 (42 :: Integer))

Is there a language extension I can use to make the former compile?

I know the Template Haskell seems silly in this example, but it's a simplified version of a more complex problem, which requires Template Haskell to process arbitrary sized tuples.


Solution

  • Apparently f1 is assigned the type Integer -> Integer instead of the more general a -> a for some reason. Adding an explicit type signature makes your example compile fine for me:

    {-# LANGUAGE TemplateHaskell #-}
    
    f1 :: a -> a
    f1 = $([| id |])
    
    main = print $ (f1 (42 :: Int), f1 (42 :: Integer))