Я играю с Template Haskell. Я хочу создать квазициклер, который позволяет мне создавать инициализаторы по умолчанию для записей, т.е. Что-то вроде
[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |]
должна создать функцию
defaultConfig = Config { shouldDoX = True, optionZ = Nothing }
В основном это тот же синтаксис, что и объявления данных, расширенные по умолчанию. Теперь record
является обычным QuasiQuoter, однако есть выражения и типы, внутри которых я не хочу анализировать себя. В идеале мне нужно было бы разделить блок внутри фигурных скобок на утверждения и искать =
и ::
.
Итак, я ищу функцию, которая фактически делает то же самое, что и с [e| ...|]
или [t| ...|]
. Я искал Hoogle для функции String -> ExpQ
или String -> Q Exp
, но ничего не нашел.
Если я не понял, что я ищу: Я знаю о QuasiQuoters. Как я уже говорил, record
является QuasiQuoter. Теперь строка, которая передается моему квазициктору, содержит выражения (например, Node 7 (Node 8 Nil Nil) Nil
) и типы (например, True
или Maybe (Either A B)
)). Я мог бы разобрать их сам, но я надеюсь, что есть функция, которая сделает это для меня, как если бы я передал строку в цитату вроде [e|...|]
.
Итак: Я ищу функцию, которую я могу выразить выражением как String или Type as String, и который возвращает соответствующий объект Exp
или Type
. Я считаю, что он должен жить в монаде Q, так как он должен оценивать выражение или тип на основе контекста (так же, как и цитаты).
functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp