我正在尝试用一些额外的功能扩展Happstack crash course博客:在主页上显示所有标签的列表。
我的博客记录是这样的:
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]。
这个错误的原因是什么?有没有办法解决这个问题?
发布于 2013-01-04 04:49:04
问题是你在serveTags函数上的类型签名,它应该是一元的:
serveTags :: MonadIO m => AcidState Blog -> m [Text]
serveTags acid = query' acid GetTagsEventResult是一个类型族,在这里解析为[Text]。由于query'是一元的,您的类型签名被解析为list monad,即m Text,其中m是list monad,因此出现了令人困惑的错误消息。
https://stackoverflow.com/questions/14127421
复制相似问题