Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Acid状态查询(Happstack)的意外返回类型_Haskell_Happstack_Acid State - Fatal编程技术网

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