Yesod 持久代码的类型类约束

Posted

技术标签:

【中文标题】Yesod 持久代码的类型类约束【英文标题】:Typeclass constraint for Yesod Persistent code 【发布时间】:2013-12-08 14:54:43 【问题描述】:

我试图了解对于想要将代码放入数据库中并在 Yesod 中具有持久性的函数使用什么正确的类型类约束。为了使事情具体化,我有一个类似的功能:

addToDbReturnJson obj = do
    runDB $ insert obj
    returnJson obj

我试图弄清楚它的类型签名应该是什么。我很确定它应该是这样的

addToDBReturnJson :: (ToJSON val, SomethingPersist val) => val -> 处理程序值

SomethingPersist 应该是什么?我很高兴看到解释 Persistent 类型的文档,但我无法从 Yesod 书中弄清楚。

【问题讨论】:

不要签名。编译器足够聪明,可以为您推断。 在 ghci 中加载这个文件,调用 :t addToDbReturnJson 看看编译器为你推断了什么 是的,我目前没有类型签名并且它可以工作,但我喜欢尝试理解我的代码类型(加上摆脱编译器警告)。我已经尝试过 ghci,它给了我一个我无法理解的 8 行内容。 【参考方案1】:

这对我有用-

addToDbReturnJson::(ToJSON val, PersistEntity val, 
     (PersistEntityBackend val ~ PersistMonadBackend (YesodDB App)))=>val->Handler Value

不是很直观,但在我看来,在最后一部分中,您必须指定输入值连接到的数据库与处理程序使用的数据库相同(......好吧,这很有意义,我猜)。

【讨论】:

以上是关于Yesod 持久代码的类型类约束的主要内容,如果未能解决你的问题,请参考以下文章

Yesod 持久示例

使用 Yesod 和 Persistent 类型不匹配

使用持久键列表选择 (Yesod)

yesod 持久性依赖缺失

Yesod 数据库持久记录访问

Yesod / Persistent中的外键约束?