我在Yesod应用程序中尝试持久化。我的模型文件包含
Job
issuer MemberId
addDate UTCTime
lastDate UTCTime
title Text
description Text
deriving Show Read
我的处理程序:
getProfileR :: Handler RepHtml
getProfileR = do
jobs <- runDB $ selectList [] [Desc JobAddDate]
defaultLayout $ do
setTitle "title"
$(widgetFile "profile")
在profile.hamlet中,我循环通过对象
$forall Job issuer addDate lastDate title description <- jobs
<p>#{issuer}
但是,我收到以下错误
Handler/Profile.hs:36:18:
Couldn't match type `Entity' with `JobGeneric'
In the return type of a call of `selectList'
In the second argument of `($)', namely
`selectList [] [Desc JobAddDate]'
In a stmt of a 'do' block:
jobs <- runDB $ selectList [] [Desc JobAddDate]
Handler/Profile.hs:36:18:
Kind incompatibility when matching types:
t0 :: (* -> *) -> * -> *
JobGeneric Database.Persist.GenericSql.Raw.SqlPersist :: *
In the return type of a call of `selectList'
In the second argument of `($)', namely
`selectList [] [Desc JobAddDate]'
In a stmt of a 'do' block:
jobs <- runDB $ selectList [] [Desc JobAddDate]
Build failure, pausing...
第36行是runDB行。
对Haskell不熟悉,我无法弄清楚什么是错的。我正在关注Yesod书。不幸的是,他们避开了Scaffolded Site,所以我无法完全模仿他们的代码。
答案 0 :(得分:4)
selectList
不会返回[Job]
,实际上[Entity Job]
包含Job
及其Key
*
有很多方法可以重构它来处理它,其中一种方法是:
$forall Entity jobId job <- jobs
<p>#{jobIssuer job}
在你的模板中。
或者,如果您愿意使用map entityVal
,则可以随时使用[Entity Job] -> [Job]
。
* Entity
和Key
类型实际上有点复杂,但我发现以这种方式思考它们更容易。如果您有兴趣,请阅读文档。