Есть ли в шаблоне функция haskell для цитирования?

Я играю с шаблоном Haskell. Я хочу создать квазиквотер, который позволяет мне создавать инициализаторы по умолчанию для записей, то есть что-то вроде

[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |]

должно создать функцию

defaultConfig = Config { shouldDoX = True, optionZ = Nothing }

По сути, это тот же синтаксис, что и объявления данных , расширенный по умолчанию. Сейчас record - это пользовательский QuasiQuoter, однако есть выражения и типы, внутри которых я не хочу разбирать себя. В идеале мне нужно было бы только разделить блок внутри фигурных скобок на операторы и искать = и ::.

Итак, я ищу функцию, которая эффективно делает то же самое, что и цитирование с [e| ...|] или [t| ...|]. Я искал в Google функцию String -> ExpQ или String -> Q Exp, но ничего не нашел.

На случай, если мне неясно, что я ищу: Я знаю о QuasiQuoters. Как я уже говорил: record является квази-квотером. Теперь строка, которая передается моему квазиквотеру, содержит выражения (например, Node 7 (Node 8 Nil Nil) Nil) и типы (например, True или Maybe (Either A B)). Я мог бы разобрать их сам, но я надеюсь, что есть функция, которая сделает это за меня, точно так же, как если бы я передал строку в кавычку, подобную [e|...|].

Итак: я ищу функцию, которой я могу передать выражение в виде строки или тип в виде строки и которая возвращает соответствующий объект Exp или Type. Я полагаю, что он должен жить в монаде Q, так как он должен оценивать выражение или тип на основе контекста (как это делают цитаты).

functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp
10
задан scravy 27 March 2013 в 17:37
поделиться