2013-05-02 1 views
3

Скажем, у меня есть это:Template Haskell имена деклараций как строки

f x = x + 1 

tt2 name o = sequence [valD (varP (mkName name)) (normalB [| f $(varE o) |]) []] 

Я хотел бы преобразовать tt2 в tt:

tt name o = [d| ??? = f $(varE o) |] 

Я не могу понять, что ??? должно быть. Вероятно, это потому, что я не понимаю, как работает TH. Может кто-нибудь помочь?

ответ

2

Вы пытаетесь объединить имя или шаблон. К сожалению, это невозможно. Шаблон Haskell позволяет разрешать выражения, типы и декларации сплайсинга, поэтому вы застряли с этим вручную, как в исходном коде.

См. GHC#1476 по некоторым причинам, почему сплайсинг не допускается.

+0

Хорошо. Вы полагаете, что есть более сжатый способ написать то, что я написал? – me2

+0

@ me2: Не совсем. Вы можете определить помощника, например 'simpleDecl name body = sequence [valD (varP (имя mkName)) (normalB body) []]', если вам нужно сделать это в нескольких местах, но это все. – hammar

 Смежные вопросы

  • Нет связанных вопросов^_^