【问题标题】:Local variables in Template Haskell declarations模板 Haskell 声明中的局部变量
【发布时间】:2018-07-30 22:39:34
【问题描述】:

我正在阅读pozorvlak's baby steps post on Template Haskell 试图自己理解它,我遇到了这个部分:

回想一下,我们曾尝试以编程方式生成 data Fred = Fred 形式的声明。让我们尝试使用准引用。由于调用 TH 代码的限制,我们必须将它放在它自己的模块中,所以我们将以下内容放在 Keyword.hs 中以便编译器可以找到它:

module Keyword (keyword) where

import Language.Haskell.TH.Syntax
keyword name = [d| data $(name) = $(name) |]

现在编译:

Prelude> :l Keyword.hs
[1 of 1] Compiling Keyword          ( Keyword.hs, interpreted )

Keyword.hs:6:24: parse error on input `$('

这敲响了我的钟声,似乎与我最近读过的其他内容相似,the Template Haskell package documentation

对于动态绑定的事物 (NameS),我们可能希望它们以依赖于上下文的方式进行,因此我们再次不需要名称空间。例如:

let v = mkName "T" in [| data $v = $v |]

这里我们对类型构造函数和数据构造函数使用相同的Name

嗯,几乎一样,让我们​​看看我是否可以让它工作:

 module Example where
 import Language.Haskell.TH
 let v = mkName "T" in [| data $v = $v |]

试一试:

 % ghc -XTemplateHaskell -c Example.hs

 Example.hs:3:25: parse error on input `data'

嗯...哦,也许我需要使用d 进行声明引用?

 let v = mkName "T" in [d| data $v = $v |]

现在:

 Example.hs:3:31: parse error on input `$v'

所以....发生了什么事?使用显式拼接不会改变任何一个错误。我是在断章取义地使用 Template Haskell 文档,还是只是错了?

【问题讨论】:

  • 你试过 -XQuasiQuotes 吗?

标签: haskell template-haskell


【解决方案1】:

看起来这是早于 6.12 的 GHC 版本的错误,其中 you can't splice in types。此错误已在 GHC 版本 7.10.1 中修复

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多