Haskell HXT分解XML数据

Haskell HXT分解XML数据,haskell,arrows,hxt,Haskell,Arrows,Hxt,我是个新手,所以对我放轻松点 我试图计算XML文件中特定节点的数量。XML文件的布局是这样的,在根目录下,我们有一个场景列表,在每个场景下,我们有一个层列表,每个层都有一个名为“recs”的节点。我想计算每个场景中矩形的数量。我不完全理解HXT是如何工作的 我将复制导致问题的代码摘录 process :: IOSArrow XmlTree [XmlTree] process getScene >>. map func where func a = a >>>

我是个新手,所以对我放轻松点

我试图计算XML文件中特定节点的数量。XML文件的布局是这样的,在根目录下,我们有一个场景列表,在每个场景下,我们有一个层列表,每个层都有一个名为“recs”的节点。我想计算每个场景中矩形的数量。我不完全理解HXT是如何工作的

我将复制导致问题的代码摘录

process :: IOSArrow XmlTree [XmlTree]
process getScene >>. map func
    where func a = a >>> getLayer >>> getRec
这些get函数的类型都是
IOSArrow-XmlTree-XmlTree

为什么这样不行?我该如何修复它

错误消息:

count_dirty.hs:20:16: error:
    • Couldn't match type ‘Data.Tree.NTree.TypeDefs.NTree XNode’
                     with ‘IOSLA (XIOState ()) a0 XmlTree’
      Expected type: [XmlTree] -> [IOSLA (XIOState ()) a0 XmlTree]
        Actual type: [IOSLA (XIOState ()) a0 XmlTree]
                     -> [IOSLA (XIOState ()) a0 XmlTree]
    • In the second argument of ‘(>>.)’, namely ‘map func’
      In the second argument of ‘(>>>)’, namely ‘getScene >>. map func’
      In the expression:
        readDocument [withValidate no] file >>> getScene >>. map func
   |
20 |   getScene >>. map func
   |                ^^^^^^^^

谢谢

您在这里声明
func
是一个助手函数,它接受一些
a
,然后计算
a>>getLayer>>getRec

作为

GHC可以推断,
a>>getRec
意味着
cat~IOSArrow、b~XmlTree、c~XmlTree
,将变量
a
保留为未确定类型
iosarow a XmlTree
,依此类推

func :: a -> IOSArrow XmlTree XmlTree

现在GHC非常确定,
a~XmlTree,d~iosarow-XmlTree-XmlTree
,给出

getScene >>. map func 
  :: IOSArrow 
       XmlTree 
       (IOSArrow XmlTree XmlTree)
这个问题来自于您的
map func
-
>。
需要一个纯函数作为其第二个参数<在您的例子中,code>func是一个生成箭头的函数,它不是纯箭头

我想您可能想使用,它允许您从输入生成一个箭头,然后应用该箭头,这正是您在这里所做的。在这种情况下,你会写

process = applyA (getScene >>. map func)
    ...
请注意,您使用的是列表箭头,因此类型签名仅为

process :: IOSArrow XmlTree XmlTree

您收到的错误消息是什么?我已将问题更新为包含它!谢谢你帮我修好了!
getScene >>. map func 
  :: IOSArrow 
       XmlTree 
       (IOSArrow XmlTree XmlTree)
process = applyA (getScene >>. map func)
    ...
process :: IOSArrow XmlTree XmlTree