我正在玩 Template Haskell。我想创建一个准引用器,它允许我为记录创建默认初始化程序,即类似
[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |]
应该创建一个函数
defaultConfig = Config { shouldDoX = True, optionZ = Nothing }
基本上它与数据声明的语法相同,由默认值扩展。现在record
是一个自定义的 QuasiQuoter,但是我不想在其中解析自己的表达式和类型。理想情况下,我只需要将花括号内的块划分为语句并查找=
and ::
。
[e| ...|]
所以我正在寻找一个与使用or引用有效相同的函数[t| ...|]
。我在 Hoogle 中搜索了一个函数String -> ExpQ
,或者String -> Q Exp
没有找到任何东西。
如果我不清楚我在寻找什么:我知道 QuasiQuoters。正如我所提到的:record
是一个 QuasiQuoter。现在传递给我的准引用器的字符串包含表达式 (like Node 7 (Node 8 Nil Nil) Nil
) 和类型 (like True
or Maybe (Either A B)
)。我可以自己解析这些,但我希望有一个函数可以为我完成,就像我将字符串传递到像[e|...|]
.
所以:我正在寻找一个函数,我可以将表达式作为字符串或类型作为字符串提供,并返回适当的Exp
或Type
对象。我相信它必须存在于 Q monad 中,因为它应该根据上下文评估表达式或类型(就像引用一样)。
functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp