如何解决使用 Haskell 和 HXT 解析 XML
我正在尝试使用 https://hackage.haskell.org/package/hxt 解析 XML 文件。在下面的代码中,我需要使用从外部标签中的属性获得的额外参数来解析内部元素。但是 i
在第二行中不可用(第二个箭头?)。如何将 i
传递给 getTerminal
?
getSentence = atTag "s" >>>
proc x -> do
i <- getAttrValue "id" -< x
ts <- listA (getTerminal i) <<< atTag "terminals" -< x
returnA -< Sentence { sid = i,terminals = ts }
...
getTerminal sid = atTag "t" >>>
proc x -> do
i <- getAttrValue "id" -< x
lem <- getAttrValue "lemma" -< x
returnA -< Terminal { lemma = lem,tid = nid i }
where
nid x = fromMaybe x (stripPrefix (sid ++ "_") x)
也就是说,i
包含我想传递给 getTerminal
的值。
解决方法
使用 -<<
而不是 -<
使本地绑定可用于箭头:
getSentence = atTag "s" >>>
proc x -> do
i <- getAttrValue "id" -< x
ts <- listA (getTerminal i) <<< atTag "terminals" -<< x
returnA -< Sentence { sid = i,terminals = ts }
请注意,-<<
是根据 ArrowApply
中的 app
实现的。例如,抛开语法上的尴尬,上面的出现可以替换为:
ts <- app <<< listA . getTerminal *** atTag "terminals" -< (i,x)
hxt 的相关箭头是 ArrowApply
的实例,因此 -<<
可以与它们一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。