2016-01-12 64 views
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'中重用數據。

回答

1

閱讀更多關於箭頭後,我發現這一點:

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

現在使用constA類型的元素XmlTree我們得到一個箭頭,我們可以重用:

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

我必須使用head x作爲x將是[XmlTree]類型,但第二個箭頭預計XmlTree

1

你需要做的parseDoc您在getWindow做同樣的事情:

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

謝謝。這是我最終會使用的。但是我仍然想知道是否有一種方法可以將我用'x < - runX parseRoot'得到的簡單返回值'x'轉換爲箭頭'a'供以後使用:'runX $ a >>> parseSomething' ' –

+1

我不明白你的意思是「將一個值轉換爲一個箭頭」。箭是一種從一種價值到另一種價值的態度。函數是另一種態射,所以它有點像說你想把你的值轉換成一個函數。一個函數做什麼? –

+1

沒錯! 「將一個值轉換爲一個箭頭」正是我的意思,並且有一個函數'constA'來做到這一點。我想我沒有提出足夠好的原始問題。 –