Стрелки Хаскеля:вставить значение в список
Вопрос
Я изучаю стрелки 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
- Как написать
allRegions
?Или, лучше, где мне копать, чтобы это написать? - Другой вопрос: как не только добавить
regions
результат, но вставитьbaseRegion
в какое-то конкретное место списка регионов (например, после второго элемента или после элемента, имя которого начинается с буквы «E»)?
Решение
Я думаю, что комбинатор, который вы ищете, (>>.)
в ArrowList
тип-класс.Это позволяет вам применить любую функцию списка к стрелке.Например.было бы добавить элемент перед стрелкой.
regions tree >>. (baseRegion:)
Что касается вашего второго вопроса, вы можете написать служебную функцию, чтобы вставить регион в список в нужное место, например.что-то с подписью вроде
insertRegion :: Region -> [Region] -> [Region]
и тогда вы сможете использовать его на стрелке
regions tree >>. insertRegion baseRegion
Кстати, я бы лично удалил параметр дерева из вашего regions
функцию и просто используйте явную цепочку стрелок, чтобы получилось приведенное выше.
tree >>> regions >>. insertRegion baseRegion