gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:17:53 25 4
gpt4 key购买 nike

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

我的博客记录是这样的:

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

我通过以下方式通过 id 获取博客文章(从速成类(class)复制粘贴):
-- 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] .

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

最佳答案

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

serveTags :: MonadIO m => AcidState Blog -> m [Text]
serveTags acid = query' acid GetTags
EventResult是一个类型族,这里解析为 [Text] .自 query'是 monadic,您的类型签名已解析为列表 monad,即 m Text哪里 m是列表 monad,因此是令人困惑的错误消息。

关于haskell - 酸性状态查询的意外返回类型(Happstack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14127421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com