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

时间:2013-01-02 18:46:38

标签: haskell happstack acid-state

我正在尝试使用其他一些功能扩展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]

出现此错误的原因是什么?有办法解决吗?

1 个答案:

答案 0 :(得分:2)

问题是serveTags函数上的类型签名,它应该是monadic:

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

EventResult是一个类型系列,此处可解析为[Text]。由于query'是monadic,因此您的类型签名已解析为列表monad,即m Text,其中m是列表monad,因此会出现令人困惑的错误消息。