2011-12-11 11 views
5

Sto cercando di imparare le frecce in Haskell, quindi sto scrivendo una semplice applicazione con la libreria HXT basata su frecce per XML. Gli esempi nei wiki e nelle esercitazioni HXT forgo le firme dei tipi di funzione. Tuttavia, mi piacciono molto i tipi e sto cercando di capire come usarli. Questo è dove ho incontrato un ostacolo. Alla luce di queste funzioni:Frecce/HXT e tipi di firme

readXml str = runX (readString [withValidate no] str) 

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

Immagino che dovrebbero essere assegnate le seguenti firme:

readXml ∷ String → IO [XmlTree] 

atTag ∷ ArrowXml a ⇒ String → a XmlTree XmlTree 

Sto cercando di agganciare questi sintassi freccia insieme usando come tale:

parseItem = proc str -> do 
    desc <- text <<< atTag "description" <<< arr readXml -< str 
    ... 

Tuttavia, se le mie mie firme di tipo sono corrette (GHC non si è lamentato), avrei bisogno di un modo in cui combinare la sintassi di monad e la sintassi della freccia per ottenere il XmlTree e restituirlo a IO.

Non so come procedere. Qualcuno ha qualche intuizione?

risposta

3

Uso runX nella definizione di readXml "converte" una freccia in una funzione, e utilizzando arr nella definizione di parseItem converte tale funzione di nuovo in una freccia di nuovo. Ora, farlo in questo modo andrebbe bene, tranne che readString restituisce un IOStateArrow (un alias di tipo speciale per la IOSLA - freccia di elenco stato IO), che deve essere trattato non solo come Arrow, ma in particolare come IOArrow; nel frattempo, lo stai trattando come un puro Arrow rewrapping usando arr.

Hai due opzioni qui:

  1. guadagna readXml = readString [withValidate no], in modo che readXml :: String -> IOStateArrow s b XmlTree. Quindi puoi semplicemente fare ... <<< readXml str in parseItem.
  2. Utilizzare arrIO per sollevare readXml in una freccia IO, che consente di utilizzarlo nel modo desiderato.

Vorrei utilizzare l'opzione 1 in questo caso, poiché sembra superfluo eseguire questo wrapping di frecce se non ci sono motivi particolari per farlo.

+0

Sono confuso. Nello scenario 1, readXml non è in realtà una freccia, piuttosto una funzione che restituisce una freccia. Come può essere usato con la sintassi della freccia come se fosse uno? – providence

+0

Ho dimenticato di rimuovere '- <' quando ho copiato il codice; dovrebbe essere più chiaro ora. – dflemstr