У меня есть игрушечная программа:
$ cat a.hs
main = putStrLn "Toy example"
$ runghc a.hs
Toy example
Добавим к нему немного Template 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 сообщается для другого местоположения —
b.hs:3:1
— но в остальном поведение идентично.
module ... where
и выдает свои объявления верхнего уровня. - person n. 1.8e9-where's-my-share m.   schedule 01.10.2011quoteFile
и квазикавычками. Однако у меня сложилось впечатление, что есть квази-кавычки, предоставляемые библиотекой, которые работают так же, как[d|...|]
, но теперь похоже, что это не так. - person n. 1.8e9-where's-my-share m.   schedule 02.10.2011