首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Acid状态查询的意外返回类型(Happstack)

Acid状态查询的意外返回类型(Happstack)
EN

Stack Overflow用户
提问于 2013-01-03 02:46:38
回答 1查看 258关注 0票数 4

我正在尝试用一些额外的功能扩展Happstack crash course博客:在主页上显示所有标签的列表。

我的博客记录是这样的:

代码语言:javascript
复制
data Blog = Blog
    { nextPostId :: PostId
    , posts      :: IxSet Post
    , allTags    :: [Text] 
    }
    deriving (Data, Typeable)

我通过以下方式通过id获取博客帖子(复制自速成课程):

代码语言:javascript
复制
-- 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
        ...

它工作得很好。

当我尝试以类似的方式查询所有标签时:

代码语言:javascript
复制
-- Models.hs 

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

-- Controller.hs

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

恐怕行不通。错误堆栈跟踪为:

代码语言:javascript
复制
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]

这个错误的原因是什么?有没有办法解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 04:49:04

问题是你在serveTags函数上的类型签名,它应该是一元的:

代码语言:javascript
复制
serveTags :: MonadIO m => AcidState Blog -> m [Text]
serveTags acid = query' acid GetTags

EventResult是一个类型族,在这里解析为[Text]。由于query'是一元的,您的类型签名被解析为list monad,即m Text,其中m是list monad,因此出现了令人困惑的错误消息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14127421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档