Flechas Haskell:insertar valor en una lista
Pregunta
Estoy aprendiendo las flechas de Haskell en caso de analizar una página html simple.La tarea es descargar el sitio de la región base. baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb"
, analiza enlaces a otras regiones (a través de 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
y agregue una región base al resultado:
allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
- Cómo escribir
allRegions
?O, mejor, ¿dónde debería excavar para escribirlo? - Otra pregunta es cómo no solo agregar
regions
resultado pero insertarbaseRegion
¿A algún lugar particular de la lista de regiones (por ejemplo, después del segundo elemento o después de un elemento cuyo nombre comienza con 'E')?
Solución
Creo que el combinador que está buscando es (>>.)
en el ArrowList
clase de tipo.Le permite aplicar cualquier función de lista en la flecha.P.ej.Preparar un elemento al frente de la flecha sería.
regions tree >>. (baseRegion:)
A fin de su segunda pregunta, puede escribir una función de utilidad para insertar la región en la lista en el lugar correcto E.G.algo con una firma como
insertRegion :: Region -> [Region] -> [Region]
y luego puedes usarlo en la flecha
regions tree >>. insertRegion baseRegion
Por cierto, eliminaría personalmente el parámetro de árbol de su función regions
y simplemente usaría la flecha explícita que encadena para que se convierta anteriormente.
tree >>> regions >>. insertRegion baseRegion