2

为什么以下编译失败(在 GHC 7.4.2 上)?

{-# LANGUAGE TemplateHaskell #-}

f1 = $([| id |])

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

请注意,以下编译正常:

{-# LANGUAGE TemplateHaskell #-}

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

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

有没有我可以用来编译前者的语言扩展?

我知道 Template Haskell 在这个例子中看起来很傻,但它是一个更复杂问题的简化版本,它需要 Template Haskell 处理任意大小的元组。

4

1 回答 1

4

显然由于某种原因f1被分配了类型Integer -> Integer而不是更通用的类型。a -> a添加显式类型签名使您的示例对我来说编译得很好:

{-# LANGUAGE TemplateHaskell #-}

f1 :: a -> a
f1 = $([| id |])

main = print $ (f1 (42 :: Int), f1 (42 :: Integer))
于 2012-08-27T15:06:15.073 回答