提供派生函数的库何时需要TemplateHaskell扩展?

提供派生函数的库何时需要TemplateHaskell扩展?,haskell,cabal,template-haskell,Haskell,Cabal,Template Haskell,我的印象是,使用类型为::Name->Q[Dec]的函数必须在打开TemplateHaskell扩展的情况下包装在拼接中,如中所述: 但我刚刚注意到该节目在没有拼接的情况下使用了这些TH函数(或TemplateHaskell),我只是在我正在开发的库中尝试了一下,它似乎工作得很好,即使在顶层有类似的功能: fmap concat $ forM [''X , ''Y , ''Z ] deriveFoo 然而,在做了这些修改(从拼接中删除并删除pragma)之后,我得到了,除非我在测试套件块中添加

我的印象是,使用类型为
::Name->Q[Dec]
的函数必须在打开
TemplateHaskell
扩展的情况下包装在拼接中,如中所述:

但我刚刚注意到该节目在没有拼接的情况下使用了这些TH函数(或
TemplateHaskell
),我只是在我正在开发的库中尝试了一下,它似乎工作得很好,即使在顶层有类似的功能:

fmap concat $ forM [''X , ''Y , ''Z ] deriveFoo
然而,在做了这些修改(从拼接中删除并删除pragma)之后,我得到了,除非我在测试套件块中添加了
扩展:TemplateHaskell
行,我并不真正理解这一点


那么剪接是一个神话吗?如果是这样,那么为什么我需要在测试套件的扩展列表中使用
TemplateHaskell

您是否混淆了Lens文档中的'And''后缀,以及TemplateHaskell中使用的''前缀?前者是模板haskell语法,用于引用变量的名称对象。后者只是变量名的有效字符(即-x',或“x prime”只是一个不同于x的新变量)。我在镜头中使用了模板haskell,但总是使用拼接(我当然不知道每个角落和缝隙,所以我可能会遗漏一些东西)。@jamshidh no,请参见我链接到的镜头文档顶部的
makelens
用法示例。
$(..)
语法对于顶级拼接是可选的。它仍然是模板Haskell(即使lens文档没有明确说明这一点),因此您需要以某种方式启用扩展。@raymonad这是有道理的,我猜阴谋集团的变幻莫测误导了我。如果你想回答这个问题(甚至更好:链接到文档),我会接受的。我真希望拼接语法在顶层不是可选的。它只会让人困惑,而不会让任何事情变得简单。
fmap concat $ forM [''X , ''Y , ''Z ] deriveFoo