Clinton
Clinton

Reputation: 23135

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.

Upvotes: 2

Views: 103

Answers (1)

Mikhail Glushenkov
Mikhail Glushenkov

Reputation: 15078

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))

Upvotes: 4

Related Questions