我是个新手,所以别对我太客气了。
我正在尝试计算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
| ^^^^^^^^
谢谢!
发布于 2018-08-29 03:28:21
您在这里将func
声明为一个辅助函数,该函数接受一些a
,然后计算a >>> getLayer >>> getRec
。
作为
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
,因此
func :: a -> IOSArrow XmlTree XmlTree
和
map :: (x -> y) -> [x] -> [y]
map func :: [a] -> [IOSArrow XmlTree XmlTree]
因为
(>>.) :: a b c -> ([c] -> [d]) -> a b d
getScene >>. :: ([XmlTree] -> [d]) -> IOSArrow XmlTree d
现在GHC非常确定a ~ XmlTree, d ~ IOSArrow XmlTree XmlTree
,给出了
getScene >>. map func
:: IOSArrow
XmlTree
(IOSArrow XmlTree XmlTree)
这个问题来自你的map func
-- >>.
期望一个纯函数作为它的第二个参数。在您的例子中,func
是一个生成箭头的函数,它不是纯的。
我猜您可能想要使用applyA,它允许您从输入生成一个箭头,然后应用该箭头,这正是您在这里所做的。在这种情况下,您可以编写
process = applyA (getScene >>. map func)
...
请注意,您使用的是列表箭头,因此类型签名应该是
process :: IOSArrow XmlTree XmlTree
https://stackoverflow.com/questions/51965050
复制相似问题