HXT:重用"preparsed"数据

HXT: reuse "preparsed" data

我正在尝试 'preparse' XML 将 HXT 放入 [XmlTree] 一次,然后多次重复使用此数据。

下面是我的代码:

{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
import Text.XML.HXT.Core

parseXML = readDocument [ withValidate no
                        , withRemoveWS yes  -- throw away formating WS
                        ] 

atTag tag = deep (isElem >>> hasName tag)


data UiWindow = UiWindow {
    wndName :: String,
    wndNameLib :: String,
    wndChildren :: [UiWindow]
    } deriving (Show)

initUiWindow = UiWindow {
    wndName = "empty",
    wndNameLib = "",
    wndChildren = []
    }


parseDoc docName = runX $ parseXML fileName >>> getWindow
  where
    fileName = docName ++ ".xml"


getWindow = atTag "Window" >>> proc x -> do
    libraryItemName <- getAttrValue "libraryItemName" -< x
    name <- getAttrValue "name" -< x
    children <- arrIO parseDoc -< libraryItemName
    returnA -< initUiWindow { wndName = name, wndNameLib = libraryItemName, wndChildren = children}


documentName = "DOMDocument.xml"        

parseRoot = parseXML documentName

--runX (parseRoot >>> getWindow )

如果我事先解析:

λ: x <- runX parseRoot

λ: :t x
x :: [XmlTree]
λ: :t getWindow
getWindow :: IOSLA (XIOState ()) XmlTree UiWindow

我如何运行这样的事情:

runX $ XYZ(x) >>> getWindow

或者这个:

runX $ XYZ(x) >>> getSomethingElse

允许我重复使用 'x' 中的数据。

您需要在 parseDoc 中执行与在 getWindow 中相同的操作:

runX $ parseXML filename >>> proc myDoc -> do
    window <- getWindow -< myDoc
    something <- getSomethingElse -< myDoc

在阅读了更多关于箭头的信息后,我发现了这个:

λ: :t constA
constA :: ArrowList a => c -> a b c

现在在 XmlTree 类型的元素上使用 constA 我们得到一个可以重复使用的箭头:

main = do
  x <- runX parseRoot
  windows <- runX $ constA (head x) >>> getWindow
  doors <- runX $ constA (head x) >>> getDoor

我必须使用 head x,因为 x 将是 [XmlTree] 类型,但第二个箭头需要 XmlTree.