haskell - 因式分解箭头外的箭头 do 表示法是有效的变换吗?

标签 haskell arrows hxt

我正在尝试了解 HXT,这是一个用于解析使用箭头的 XML 的 Haskell 库。对于我的具体用例,我宁愿不使用 deep因为有些情况下 <outer_tag><payload_tag>value</payload_tag></outer_tag><outer_tag><inner_tag><payload_tag>value</payload_tag></inner_tag></outer_tag> 不同但我遇到了一些奇怪的情况,感觉它应该可以工作,但实际上却不起作用。

我设法想出了一个基于 this example 的测试用例来自文档:

{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
module Main where

import Text.XML.HXT.Core

data Guest = Guest { firstName, lastName :: String }
  deriving (Show, Eq)


getGuest = deep (isElem >>> hasName "guest") >>> 
  proc x -> do
    fname <- getText <<< getChildren <<< deep (hasName "fname") -< x
    lname <- getText <<< getChildren <<< deep (hasName "lname") -< x
    returnA -< Guest { firstName = fname, lastName = lname }

getGuest' = deep (isElem >>> hasName "guest") >>> 
  proc x -> do
    fname <- getText <<< getChildren <<< (hasName "fname") <<< getChildren -< x
    lname <- getText <<< getChildren <<< (hasName "lname") <<< getChildren -< x
    returnA -< Guest { firstName = fname, lastName = lname }

getGuest'' = deep (isElem >>> hasName "guest") >>> getChildren >>>
  proc x -> do
    fname <- getText <<< getChildren <<< (hasName "fname") -< x
    lname <- getText <<< getChildren <<< (hasName "lname") -< x
    returnA -< Guest { firstName = fname, lastName = lname }


driver finalArrow = runX (readDocument [withValidate no] "guestbook.xml" >>> finalArrow)

main = do 
  guests <- driver getGuest
  print "getGuest"
  print guests

  guests' <- driver getGuest'
  print "getGuest'"
  print guests'

  guests'' <- driver getGuest''
  print "getGuest''"
  print guests''

之间getGuestgetGuest'我展开deep输入正确的数字 getChildren 。结果函数仍然有效。然后我将 getChildren 因式分解do之外阻止但这会导致结果函数失败。输出为:

"getGuest"
[Guest {firstName = "John", lastName = "Steinbeck"},Guest {firstName = "Henry", lastName = "Ford"},Guest {firstName = "Andrew", lastName = "Carnegie"},Guest {firstName = "Anton", lastName = "Chekhov"},Guest {firstName = "George", lastName = "Washington"},Guest {firstName = "William", lastName = "Shakespeare"},Guest {firstName = "Nathaniel", lastName = "Hawthorne"}]
"getGuest'"
[Guest {firstName = "John", lastName = "Steinbeck"},Guest {firstName = "Henry", lastName = "Ford"},Guest {firstName = "Andrew", lastName = "Carnegie"},Guest {firstName = "Anton", lastName = "Chekhov"},Guest {firstName = "George", lastName = "Washington"},Guest {firstName = "William", lastName = "Shakespeare"},Guest {firstName = "Nathaniel", lastName = "Hawthorne"}]
"getGuest''"
[]

我觉得这应该是一个有效的转换,但我对箭头的理解有点不稳定。难道我做错了什么?这是我应该报告的错误吗?

我正在使用 HXT 版本 9.3.1.3(撰写本文时的最新版本)。 ghc --version 打印“光荣的 Glasgow Haskell 编译系统,版本 7.4.1”。我还在带有 ghc 7.6.3 的盒子上进行了测试,并得到了相同的结果。

XML 文件具有以下重复结构(完整文件可以在 here 中找到)

<guestbook>
  <guest>
    <fname>John</fname>
    <lname>Steinbeck</lname>
  </guest>
  <guest>
    <fname>Henry</fname>
    <lname>Ford</lname>
  </guest>
  <guest>
    <fname>Andrew</fname>
    <lname>Carnegie</lname>
  </guest>
</guestbook>

最佳答案

getGuest'' 中,您有

... (hasName "fname") -< x
... (hasName "lname") -< x

也就是说,您限制为 x"fname" x"lname",任何 x 都不满足!

关于haskell - 因式分解箭头外的箭头 do 表示法是有效的变换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21995888/

相关文章:

sorting - 使用 Haskell 按字典顺序获取排列

unix - 如何安装 GHC 7.8.1 并为其分配不同的命令?

haskell - 理解 Haskell 中的箭头

haskell - 在 HXT 中使用列表

xml - 如何使用数据类型构造函数包装来自 HXT 的整个匹配列表?

debugging - 如何调试类型级程序

Haskell 反射 : does record have field?

haskell - Netwire 相互依赖的电线

haskell - 如何定义箭头的过滤函数?

xml - 在 Arrow proc 上下文中提取多个元素