1
我試圖用HXT將XML'準備好'一次放入[XmlTree],然後重複使用這些數據幾次。HXT:重複使用「preparsed」數據
下面是我的代碼:
{-# 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'中重用數據。
謝謝。這是我最終會使用的。但是我仍然想知道是否有一種方法可以將我用'x < - runX parseRoot'得到的簡單返回值'x'轉換爲箭頭'a'供以後使用:'runX $ a >>> parseSomething' ' –
我不明白你的意思是「將一個值轉換爲一個箭頭」。箭是一種從一種價值到另一種價值的態度。函數是另一種態射,所以它有點像說你想把你的值轉換成一個函數。一個函數做什麼? –
沒錯! 「將一個值轉換爲一個箭頭」正是我的意思,並且有一個函數'constA'來做到這一點。我想我沒有提出足夠好的原始問題。 –