4

Happstack 短期集中講座のブログを拡張して、いくつかの機能を追加しようとしています: ホームページにすべてのタグのリストを表示します。

私のブログ記録は次のようになります。

data Blog = Blog
    { nextPostId :: PostId
    , posts      :: IxSet Post
    , allTags    :: [Text] 
    }
    deriving (Data, Typeable)

次の方法でIDごとにブログ投稿を取得します(クラッシュコースからコピーペースト):

-- Models.hs

postById :: PostId -> Query Blog (Maybe Post)
postById pid =
     do Blog{..} <- ask
        return $ getOne $ posts @= pid

-- Controller.hs

viewPage :: AcidState Blog -> ServerPart Response
viewPage acid = 
     do pid <- PostId <$> lookRead "id"
        mPost <- query' acid (PostById pid)
        ...
        -- mPost has type Maybe Post here
        ...

そして、それは問題なく動作します。

同様の方法ですべてのタグのクエリを実行しようとすると:

-- Models.hs 

getTags :: Query Blog [Text]
getTags = 
    do Blog{..} <- ask
       return allTags

-- Controller.hs

serveTags :: AcidState Blog -> [Text]
serveTags acid = query' acid GetTags

うまくいきません。エラー スタック トレースは次のとおりです。

Blog/Controllers.hs:154:18:
   Couldn't match type `[Text]' with `Text'
   Expected type: [Text]
   Actual type: [acid-state-0.8.1:Data.Acid.Common.EventResult
                                       GetTags]
   In the return type of a call of query'
   In the expression: query' acid GetTags

の戻り値の型が であるはずなのに、なぜ なのかわかりquery'ませ[EventResult GetTags][Text]

このエラーの理由は何ですか? それを修正する方法はありますか?

4

1 に答える 1

2

問題は、関数の型シグネチャです。serveTagsモナドである必要があります。

serveTags :: MonadIO m => AcidState Blog -> m [Text]
serveTags acid = query' acid GetTags

EventResultは、ここで に解決される型ファミリーです[Text]。はモナドであるためquery'、型シグネチャはリスト モナドに解決されます。つまりm Textmはリスト モナドであり、混乱するエラー メッセージが表示されます。

于 2013-01-03T20:49:03.627 に答える