Frecce Haskell: inserisci valore in un elenco
Domanda
Sto imparando le frecce Haskell in caso di analisi della pagina HTML semplice.
Il compito è quello di scaricare il sito della regione di base baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb"
, Parse Collegamenti ad altre regioni (via HXT):
regions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
regions tree =
tree >>> multi (hasName "a" >>> hasAttrValue "class" (== ".regionlink")) >>>
proc x -> do
rname <- getText <<< getChildren -< x
rurl <- getAttrValue "href" -< x
returnA -< Region rname rurl
.
e aggiungi una regione di base al risultato:
allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
.
- .
- Come scrivere
allRegions
?O, meglio, dove dovrei scavare per scriverlo? - Un'altra domanda è come non solo aggiungere il risultato del
regions
ma inserirebaseRegion
in un particolare elenco di regime di regioni (ad esempio dopo il secondo elemento o dopo un elemento il cui nome sta iniziando con 'e')?
Soluzione
Penso che il Combinator che stai cercando sia (>>.)
in ArrowList
tipo-class.Ti consente di applicare qualsiasi funzione di elenco sulla freccia.Per esempio.Preparare un elemento alla parte anteriore della freccia sarebbe.
regions tree >>. (baseRegion:)
.
Per quanto riguarda la tua seconda domanda, è possibile scrivere una funzione di utilità per inserire la regione nell'elenco per il punto corretto E.G.qualcosa con una firma come
insertRegion :: Region -> [Region] -> [Region]
.
E poi puoi usarlo sulla freccia
regions tree >>. insertRegion baseRegion
.
BTW Rimuovere personalmente il parametro dell'albero dalla funzione regions
e solo utilizzare la catena di freccia esplicita in modo che quanto sopra diventi.
tree >>> regions >>. insertRegion baseRegion
.