4

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に慣れていないので、何が悪いのか理解できません。私はYesodBookをフォローしています。残念ながら、彼らは足場サイトを避けているので、私は彼らのコードを完全に模倣することはできません。

4

1 に答える 1

4

selectListは戻りません[Job]。実際には、とその*[Entity Job]の両方が含まれています。JobKey

これを処理するためにリファクタリングする方法はいくつかあります。1つは次のとおりです。

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

テンプレート内。

または、それを使用したい場合はmap entityVal、いつでも使用して方向転換することができます。[Entity Job] -> [Job]

*EntityKeyタイプは実際にはもう少し複雑ですが、このように考える方が簡単だと思います。興味のある方はドキュメントをお読みください。

于 2012-07-02T13:43:25.753 に答える