微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Haskell 和 HXT 解析 XML

如何解决使用 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 举报,一经查实,本站将立刻删除。