Haskell Acid状态查询(Happstack)的意外返回类型
我试图通过一些附加功能扩展博客:在主页上显示所有标签的列表 我的博客记录如下所示:Haskell Acid状态查询(Happstack)的意外返回类型,haskell,happstack,acid-state,Haskell,Happstack,Acid State,我试图通过一些附加功能扩展博客:在主页上显示所有标签的列表 我的博客记录如下所示: data Blog = Blog { nextPostId :: PostId , posts :: IxSet Post , allTags :: [Text] } deriving (Data, Typeable) 我通过以下方式通过id获得博客帖子(从速成班复制粘贴): 我不明白为什么query'的返回类型是[EventResult GetTags
data Blog = Blog
{ nextPostId :: PostId
, posts :: IxSet Post
, allTags :: [Text]
}
deriving (Data, Typeable)
我通过以下方式通过id获得博客帖子(从速成班复制粘贴):
我不明白为什么query'
的返回类型是[EventResult GetTags]
,而它应该是[Text]
这个错误的原因是什么?有办法解决吗?问题是您在
serveTags
函数上的类型签名,它应该是一元的:
serveTags :: MonadIO m => AcidState Blog -> m [Text]
serveTags acid = query' acid GetTags
EventResult
是一个类型族,在这里解析为[Text]
。由于query'
是一元的,因此您的类型签名被解析为列表单子,即m Text
,其中m
是列表单子,因此出现了令人困惑的错误消息。该错误消息向我暗示EventResult
是一个类型函数,EventResult GetTags
是[Text]
,当您假设它应该是Text
时,类型错误中提到的包名令人担忧。我怀疑acid state的多个版本以某种方式参与其中。检查您的软件包数据库是否健全,包括有关编译过程的更多详细信息(您使用的是Cabal吗?您提供的参数是什么?)只想将此留在这里:感谢改进acid状态教程!谢谢但是,如果我需要获取[Text]
,应该怎么做呢?只需使用do符号来获取实际值,即标记。不幸的是,我遇到了这样的问题:当我尝试执行以下操作时:arrangeTags::AcidState Blog->[Text]arrangeTags acid=dot,您无法在Haskell中转义IO<代码>执行x m…
。请注意,hapstack中的ServerPart
实际上是MonadIO
的一个实例,因此您可以简单地在hapstack处理程序中直接使用带有do符号的serveTags
,就像速成班示例中使用了query'acid(PostById pid)
。
-- 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
serveTags :: MonadIO m => AcidState Blog -> m [Text]
serveTags acid = query' acid GetTags