Haskell setas:introduza o valor para uma lista
Pergunta
Eu estou aprendendo haskell setas no caso de análise simples página html.A tarefa é site de download de região da base de dados baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb"
, analisar links para outro regiões (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 acrescentar uma base de região para o resultado:
allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
- Como escrever
allRegions
?Ou, melhor, onde devo cavar para escrevê-lo? - Outra questão é como não apenas acrescentar
regions
's de resultado, mas de inserirbaseRegion
a algum determinado lugar da lista de regiões (por exemplo, após o segundo elemento ou depois de um elemento cujo nome está começando com "E")?
Solução
Eu acho que o combinator que você está procurando é (>>.)
no ArrowList
tipo-classe.Ele permite que você aplicar qualquer função de lista na seta.E. g.adicionar um elemento à frente da seta seria.
regions tree >>. (baseRegion:)
Assim como para a sua segunda pergunta, você pode escrever uma função de utilidade para inserir a região na lista para o lugar correto e.g.algo com uma assinatura como
insertRegion :: Region -> [Region] -> [Region]
e, em seguida, você pode usá-lo na seta
regions tree >>. insertRegion baseRegion
Btw, eu pessoalmente teria de remover o parâmetro de árvore a partir de sua regions
função e apenas utilizar explícita seta encadeamento tão acima se torna.
tree >>> regions >>. insertRegion baseRegion