Как мне написать квазиквотер в терминах другого квазиквартального числа

Если я работаю со сторонним квазиквотером, например thirdParty :: QuasiQuoter, и хочу написать свой собственный в терминах этого квазиквотера, как мне это сделать? В ghci пробовал

runQ [| [thirdParty| |] |]

Но это выводит (в моем случае):

LamE [VarP _render_2] (AppE (VarE GHC.Base.return) (ConE GHC.Tuple.()))

Это не говорит мне, что такое абстрактное синтаксическое дерево для "[thirdParty | |]", поэтому кажется, что я не могу построить такой шаблон с шаблоном Haskell.


person Gareth Charnock    schedule 04.10.2014    source источник


Ответы (1)


Ответ на первый взгляд прост, и я подумал об этом в тот момент, когда закончил задавать вопрос. В QuasiQuoter нет ничего волшебного. Это старый добрый скучный алгебраический тип данных! Просто делать:

myQuasiQuoter = QuasiQuoter { quoteExp = f (quoteExp thirdParty) }

Где f - это функция, которая при необходимости преобразует квазиквотер. При необходимости сделайте то же самое для quotePat, quoteType и quoteDec.

person Gareth Charnock    schedule 04.10.2014