我正在玩模板哈斯克爾。我想創建一個準加引號,讓我創造的記錄默認初始化,即像有引用模板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|...|]
一樣。
所以:我正在尋找一個函數,我可以將一個表達式作爲字符串或類型作爲字符串提供,並返回適當的對象。我相信它必須存在於Q monad中,因爲它應該根據上下文來評估表達式或類型(就像引用那樣)。
functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp
我認爲[haskell-src-meta](http://hackage.haskell.org/package/haskell-src-meta)可能有你正在尋找的東西。 – hammar 2013-03-27 18:16:46