Я пытаюсь изучить немного шаблона Haskell и Quasi Quotation, и я ищу функцию, которая принимает String
и анализирует ее на Q Exp
, поэтому тип:
String -> Q Exp
Пробовал поиск hoogle, но результаты, которые я видел, связаны с подъемом строковых литералов до Q Exp
, и ближайший я нашел Language.Haskell.TH.dyn
, который делает то, что я хочу, но только для одной переменной.
Есть ли другие варианты? Например. специальный синтаксис? Я просто разбираюсь в [||]
и $()
, так что, возможно, есть что-то для этой цели?
Пример того, как я предполагаю, что это сработает:
runQ (parse "(1+)") == InfixE (Just (LitE (IntegerL 1))) (VarE GHC.Num.+) Nothing
Кроме того, я знаю об этом
runQ [| (1+) |] == InfixE (Just (LitE (IntegerL 1))) (VarE GHC.Num.+) Nothing
но это не работает с переменными строками, потому что - понятно - строка внутри берется как литерал.
runQ [| "(1+)" |] == LitE (StringL "(1+)")
Изменить (2015-07-25): Я начал использовать haskell-src-meta
, и, похоже, он работает до сих пор. Однако для cabal install
(около 10 минут на моей машине) требуется довольно много времени. Какой позор, мой пакет на самом деле довольно мал, и я хотел бы, если бы установка была быстрой. Кто-нибудь знает о решении, которое имеет меньшие зависимости?