Стрелки Хаскеля:вставить значение в список

StackOverflow https://stackoverflow.com//questions/23044109

  •  21-12-2019
  •  | 
  •  

Вопрос

Я изучаю стрелки Haskell в случае анализа простой HTML-страницы.Задача — скачать сайт базового региона. baseRegion = Region "Yekaterinburg" "http://example.com/r/ekb", парсить ссылки на другие регионы (через 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

и добавьте базовый регион к результату:

allRegions :: ArrowXml cat => cat a (NTree XNode) -> cat a Region
  1. Как написать allRegions?Или, лучше, где мне копать, чтобы это написать?
  2. Другой вопрос: как не только добавить regionsрезультат, но вставить baseRegion в какое-то конкретное место списка регионов (например, после второго элемента или после элемента, имя которого начинается с буквы «E»)?
Это было полезно?

Решение

Я думаю, что комбинатор, который вы ищете, (>>.) в ArrowList тип-класс.Это позволяет вам применить любую функцию списка к стрелке.Например.было бы добавить элемент перед стрелкой.

regions tree >>. (baseRegion:)

Что касается вашего второго вопроса, вы можете написать служебную функцию, чтобы вставить регион в список в нужное место, например.что-то с подписью вроде

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

и тогда вы сможете использовать его на стрелке

regions tree >>. insertRegion baseRegion

Кстати, я бы лично удалил параметр дерева из вашего regions функцию и просто используйте явную цепочку стрелок, чтобы получилось приведенное выше.

tree >>> regions >>. insertRegion baseRegion
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top