Frage

Ich lerne Haskell-Pfeile beim Parsen einer einfachen HTML-Seite.Die Aufgabe besteht darin, die Site der Basisregion herunterzuladen baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb", parse Links zu anderen Regionen (über 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

und fügen Sie dem Ergebnis eine Basisregion hinzu:

allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
  1. Wie schreibe ich allRegions?Oder besser, wo soll ich graben, um es zu schreiben?
  2. Eine andere Frage ist, wie man nicht nur anhängt regionsergebnis aber einfügen baseRegion zu einer bestimmten Stelle der Regionsliste (zum Beispiel nach dem zweiten Element oder nach einem Element, dessen Name mit 'E' beginnt)?
War es hilfreich?

Lösung

Ich denke, der Kombinator, den Sie suchen, ist (>>.) in der ArrowList typ-Klasse.Sie können damit eine beliebige Listenfunktion auf den Pfeil anwenden.Z.B.das Voranstellen eines Elements vor dem Pfeil wäre.

regions tree >>. (baseRegion:)

Für Ihre zweite Frage können Sie eine Dienstprogrammfunktion schreiben, um den Bereich in die Liste an der richtigen Stelle einzufügen, z. B.etwas mit einer Signatur wie

insertRegion :: Region -> [Region] -> [Region]

und dann können Sie es auf dem Pfeil verwenden

regions tree >>. insertRegion baseRegion

Übrigens würde ich persönlich den Baumparameter von Ihrem entfernen regions funktion und benutze einfach explizite Pfeilverkettung, damit das Obige wird.

tree >>> regions >>. insertRegion baseRegion
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top