2013-03-27 33 views
10

我正在玩模板哈斯克爾。我想創建一個準加引號,讓我創造的記錄默認初始化,即像有引用模板haskell函數嗎?

[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |] 

應該創建一個功能

defaultConfig = Config { shouldDoX = True, optionZ = Nothing } 

基本上是相同的語法數據聲明,默認情況下擴展值。現在record是一個自定義QuasiQuoter,但是有一些表達式和類型我不想分析自己。理想情況下,我只需要將大括號內的塊分成報表並查找=::

所以我正在尋找一個功能,它有效地做與引用[e| ...|][t| ...|]一樣的功能。我搜索了Hoogle功能String -> ExpQString -> Q Exp,但沒有找到任何內容。

如果我不清楚我在找什麼:我對QuasiQuoters有所瞭解。正如我所提到的:record一個QuasiQuoter。現在,傳遞給我的準標量的字符串包含表達式(如Node 7 (Node 8 Nil Nil) Nil)和類型(如TrueMaybe (Either A B))。我可以自己解析這些,但是我希望有一個函數可以幫我實現,就像我把字符串傳遞給[e|...|]一樣。

所以:我正在尋找一個函數,我可以將一個表達式作爲字符串或類型作爲字符串提供,並返回適當的對象。我相信它必須存在於Q monad中,因爲它應該根據上下文來評估表達式或類型(就像引用那樣)。

functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp 
+5

我認爲[haskell-src-meta](http://hackage.haskell.org/package/haskell-src-meta)可能有你正在尋找的東西。 – hammar 2013-03-27 18:16:46

回答

1

你有正確的想法,但它會像String -> Q [Dec]

功能爲了讓你必須創建具有String -> Q Blah類型的四大功能QuasiQuoter類型的值的quasiquoter其中布拉赫是模板你正在拼接的哈斯克爾類型。

在你的情況下,你只需要定義聲明報價單。

quoteRecord :: String -> Q [Dec] 
quoteRecord = ... 

record :: QuasiQuoter 
record = QuasiQuoter (error "record is not a expression quoter") 
        (error "record is not a pattern quoter") 
        (error "record is not a type quoter") 
        quoteRecord 

然後,您可以使用您的記錄quasiquoter在另一個文件

[record| ... |] 

上有Haskell wiki

好走通過您可能也想看看BNFC-meta這將產生一個quasiquoter從語法。

+0

我想你可能會誤解我的問題。我對QuasiQuoters有所瞭解。但是,與bnfc-meta的鏈接很有趣。編輯對問題的進一步解釋。 – scravy 2013-03-27 17:38:30

+1

這聽起來像你想要的是反引號。如果是的話,維基解釋了這個過程。 BNFC-meta也生產提供反引號的分析器。 – 2013-03-27 18:15:49