Я играю с шаблоном 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