Gram z Template Haskell. Chcę stworzyć quasi Quoter która pozwala mi tworzyć domyślne inicjalizatory Records, czyli coś podobnegoCzy istnieje szablon funkcji haskell do cytowania?
[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |]
należy utworzyć funkcję
defaultConfig = Config { shouldDoX = True, optionZ = Nothing }
Zasadniczo to ta sama składnia jak deklaracje danych, rozszerzone domyślnie wartości. Teraz record
jest niestandardowym QuasiQuoter, jednak istnieją wyrażenia i typy, w których nie chcę się parsować. Idealnie musiałbym tylko podzielić blok wewnątrz nawiasów klamrowych na zdania i poszukać =
i ::
.
Poszukuję więc funkcji, która skutecznie robi to samo, co cytowanie z [e| ...|]
lub [t| ...|]
. Szukałem w serwisie Hoogle funkcji String -> ExpQ
lub String -> Q Exp
, ale niczego nie znalazłem.
Na wypadek, gdy nie miałem jasności co do tego, czego szukam: Wiem o QuasiQuoters. Jak wspomniałem: record
jest quasiQuoter. Teraz ciąg, który jest przekazywany do mojego quasi-quotera, zawiera Wyrażenia (jak Node 7 (Node 8 Nil Nil) Nil
) i Typy (jak True
lub Maybe (Either A B)
). Mógłbym je przetworzyć, ale mam nadzieję, że istnieje funkcja, która zrobi to za mnie, tak jakbym przekazał ciąg znaków do cytatu, takiego jak [e|...|]
.
A więc: szukam funkcji, którą mogę podać jako String lub Type jako ciąg, i która zwraca odpowiedni obiekt Exp
lub Type
. Uważam, że musi on żyć w monosie Q, ponieważ powinien ocenić ekspresję lub typ na podstawie kontekstu (tak jak robią to cytaty).
functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp
Myślę, że [haskell-src-meta] (http://hackage.haskell.org/package/haskell-src-meta) może mieć to, czego szukasz. – hammar