【发布时间】:2011-11-28 23:26:01
【问题描述】:
我有一个玩具程序:
$ cat a.hs
main = putStrLn "Toy example"
$ runghc a.hs
Toy example
让我们添加一些模板 Haskell 到它:
$ cat b.hs
{-# LANGUAGE TemplateHaskell #-}
id [d|
main = putStrLn "Toy example"
|]
$ runghc b.hs
b.hs:3:0: parse error (possibly incorrect indentation)
那么,让我们修复缩进:
$ cat c.hs
{-# LANGUAGE TemplateHaskell #-}
id [d|
main = putStrLn "Toy example"
|]
$ runghc c.hs
Toy example
一个空格就足够了,但我必须缩进两个尾行。
我可以避免缩进我的大部分模块吗? (我的真实模块不止一行代码。)(并且不使用{ ; ; } 符号?)
我确实希望在引用中捕获所有的模块声明 - 在普通代码中,我可以将 (...) 替换为 $ ...,是否有一些等效的 [d|...|] 可以让我避免使用右括号和缩进吗?
或者有什么方法模块 A 可以说任何模块 B 的顶级声明 A 是自动导入的由 A 导出的函数处理?
注意事项:
- 我的真实程序中的模板 Haskell 比
id更复杂——它扫描声明以查找以prop_开头的变量名,并构建一个包含它们的测试套件。有没有其他纯粹的 Haskell 方法可以代替,而无需直接修改源文件? - 我正在使用 GHC v6.12.1。当我使用 GHC v7.0.3 时,针对不同位置(
b.hs:3:1)报告了 b.hs 的错误,但其他方面的行为是相同的。
【问题讨论】:
-
我不知道为什么 GHC 一直坚持额外缩进,但为什么不回避问题并使用文件引用器呢?也许写一个接受一个完整的模块文件,带有
module ... where标头,并吐出它的顶级声明。 -
@n.m.什么是文件引用器?另外,请记住,您不能使用 TH 生成导入声明、固定性声明和其他一些东西。
-
@Jonas Duregård:对不起,我刚刚编造了这个词。这是您通过
quoteFile和准报价器获得的东西。但是我的印象是图书馆提供的准引用器就像[d|...|]一样工作,但现在看起来不是这样。