Yesod持久类型错误

时间:2012-07-01 20:34:14

标签: haskell yesod

我在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,所以我无法完全模仿他们的代码。

1 个答案:

答案 0 :(得分:4)

selectList不会返回[Job],实际上[Entity Job]包含Job及其Key *

有很多方法可以重构它来处理它,其中一种方法是:

$forall Entity jobId job <- jobs
    <p>#{jobIssuer job}

在你的模板中。

或者,如果您愿意使用map entityVal,则可以随时使用[Entity Job] -> [Job]

* EntityKey类型实际上有点复杂,但我发现以这种方式思考它们更容易。如果您有兴趣,请阅读文档。