可以使用template-haskell生成准引号吗?

时间:2014-07-25 10:01:24

标签: haskell yesod template-haskell

我目前正在开展的项目广泛使用persistent。我想使用json而不是persistent的准引用语法来指定模型。现在,我使用脚本生成persistent期望使用simple-templates的quasiquote。这在工作流程中增加了一个相当尴尬的步骤。使用template-haskell可以避免这种情况吗?

目前由脚本生成:

-- File : ProjSpecific.Models

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
[persistLowerCase|
Person
    name String
    age Int Maybe
    deriving Show
BlogPost
    title String
    authorId PersonId
    deriving Show
|]

这就是我理想的做法:

-- File : ProjSpecific.Config

import Data.Aeson.QQ
import Data.Aeson (Value)

models :: Value
models = [aesonQQ| {some json encoding of above models} |]

-- File : ProjSpecific.Models

complie time logic to generate the persistent models

关于如何做到这一点的任何想法,还是有更好的方法来帮助我正在尝试做什么?

1 个答案:

答案 0 :(得分:4)

是的,应该相对无痛。您基本上想要使用persistLowerCase中的quoteExp字段,它会为您提供类型为String -> Q Exp的函数。使用预处理器将JSON转换为预期的语法,然后将其传递给函数。