Мохнатые уроды и моральные пёзды. Войти !bnw Сегодня Клубы
На провах малоинтеллектуального онанизма. Есть тип-произведение T a, который Functor, Foldable, Traversable и вообще по сути узкоспециализированный список фиксированной длинны. Также у меня есть значение типа T (Parser Token), которое представляет из себя этот самый список набитый абсолютно одинаковыми значениями монадических парсеров. При помощи sequence я превращаю это значение в парсер типа Parser (T Token) и радуюсь. Теперь положим, что моя грамматика малость изменилась и кто-то расставил разделители между токенами (то есть разделителей на один меньше чем токенов). Могу я при помощи Foldable/Traversable и исходного значения T (Parser Token) построить корректный парсер Parser (T Token) для новой грамматики?
Рекомендовали: @komar
#1K8QPD / @ndtimofeev / 2752 дня назад

не спец в х-е, но может идея пригодится: http://pastebin.com/tspPZeSj , подобную хуиту пихать в функцию, которая заменит sequence. Или до sequence пройтись по этому самому, который foldable, таким вот образом.
#1K8QPD/ZQH / @gds / 2752 дня назад
подгляди в своей любимой библиотеке-конструкторе монадических парсеров
#1K8QPD/48B / @anonymous / 2752 дня назад
@gds Насколько я понял приведённый код, там есть принципиальное отличе: на выходе у тебя получается сторка/массив байт/один хрен безразмерный тип. А тип T выглядит примерно как data T a = T { хуй :: a, пизда :: a, джигурда :: a } (значение соответственно выглядит как T { хуй = parseToken, пизда = parseToken, джигурда = parseToken } и проблема в том, что parseDelim просто некуда пихать: между хуём и пиздой ничего нет. В итоге придумал решение вида траверса списка с аккумулятором по которому определяется «голова» это списка или нет и добавлением парсера разделителя ко всем парсерам «хвоста» (чтобы вышло что-то вроде T { хуй = parseToken, пизда = parseDelim *> parseToken, джигурда = parseDelim *> parseToken }). Выглядит это как говноедство^Wпрограммирование, а не интеллектуальный онанизм. Я разочарован. Лучше бы мекс варил, честное слово. И на последок немного хаскель гольфа для тех кто уже забыл как оно бывает и настольгирует: sequenceWithDelim :: (Applicative f, Traversable t) => f b -> t (f a) -> f (t a) sequenceWithDelim delim = sequenceA . snd . mapAccumL (\acc v -> (False, unless acc (void delim) *> v)) True
#1K8QPD/MRY / @ndtimofeev --> #1K8QPD/ZQH / 2752 дня назад
@anonymous Вот не встречал ничего подобного. Видел комбинаторы плана вот парсер для разделителя, вот парсер для токена, давайте соберём из этого обычный односвязный список. Но я хочу список фиксированной длины и конкретного типа.
#1K8QPD/AYT / @ndtimofeev --> #1K8QPD/48B / 2752 дня назад
@ndtimofeev > траверса списка с аккумулятором по которому определяется «голова» это списка или нет и добавлением парсера разделителя ко всем парсерам «хвоста» идея, которую хотел показать, была именно такой: выделяем первый элемент через acc=`Empty, а дальнейшие в аккумуляторе получаются как `String <что надо>, и очень даже хватает foldable для такого. А думал, вообще, про то, что через свёртку (котоморфизм) можно в теории выразить любой алгоритм, проходящий по структуре данных.
#1K8QPD/CCK / @gds --> #1K8QPD/MRY / 2752 дня назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.