首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell HXT拆分XML数据

Haskell HXT拆分XML数据
EN

Stack Overflow用户
提问于 2018-08-22 18:42:13
回答 1查看 67关注 0票数 1

我是个新手,所以别对我太客气了。

我正在尝试计算XML文件中特定节点的数量。XML文件的布局是这样的:在根目录下,我们有一个场景列表,在每个场景下,我们有一个层列表,每个层都有一个叫做'recs‘的节点。我想数一下每个场景中的长方形的数量。我不完全理解HXT是如何工作的。

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

代码语言:javascript
复制
process :: IOSArrow XmlTree [XmlTree]
process getScene >>. map func
    where func a = a >>> getLayer >>> getRec

每个get函数都是IOSArrow XmlTree XmlTree类型

为什么这个不起作用?我该如何修复它呢?

错误消息:

代码语言:javascript
复制
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
   |                ^^^^^^^^

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-29 03:28:21

您在这里将func声明为一个辅助函数,该函数接受一些a,然后计算a >>> getLayer >>> getRec

作为

代码语言:javascript
复制
getRec :: IOSArrow XmlTree XmlTree
(>>>)  :: (Category cat) => cat a b -> cat b c -> cat a c

GHC可以推断出a >>> getRec意味着cat ~ IOSArrow, b ~ XmlTree, c ~ XmlTree,将变量a保留为未决定的类型IOSArrow a XmlTree,因此

代码语言:javascript
复制
func :: a -> IOSArrow XmlTree XmlTree

代码语言:javascript
复制
map :: (x -> y) -> [x] -> [y]

map func :: [a] -> [IOSArrow XmlTree XmlTree]

因为

代码语言:javascript
复制
(>>.) :: a b c -> ([c] -> [d]) -> a b d 

getScene >>. :: ([XmlTree] -> [d]) -> IOSArrow XmlTree d

现在GHC非常确定a ~ XmlTree, d ~ IOSArrow XmlTree XmlTree,给出了

代码语言:javascript
复制
getScene >>. map func 
  :: IOSArrow 
       XmlTree 
       (IOSArrow XmlTree XmlTree)

这个问题来自你的map func -- >>.期望一个纯函数作为它的第二个参数。在您的例子中,func是一个生成箭头的函数,它不是纯的。

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

代码语言:javascript
复制
process = applyA (getScene >>. map func)
    ...

请注意,您使用的是列表箭头,因此类型签名应该是

代码语言:javascript
复制
process :: IOSArrow XmlTree XmlTree
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51965050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档