Vladislav
если да, придется читать
A64m
вроде в примерах в каких-то гистах автора пропозала
A64m
попробую найти
A64m
если да, придется читать
да, я похоже неправильно вспомнил вот 4.3 Deriving via isomorphisms там все же от оптимизатора зависит
Vladislav
ну это я как раз могу понять
A64m
но технически можно же ансейф коерсом кастить если проверить дженериками структурную эквивалентность, анформация об анпаке там же вроде есть
Vladislav
да unsafeCoerce-ом много что можно делать, но это не интересно, хочется representational equality
Vladislav
я вот думал было бы интересно ее постулировать в таком стиле: deriving instance Coercible A B и тогда GHC пусть проверял бы структурную эквивалентность сам
A64m
так тут не ансейфкоэрс часть интересна, а возможность проверить эквивалентность дженериками
Vladislav
а оно обманчиво
Vladislav
наверняка
Vladislav
data T1 = MkT1 A B C data T2 = MkT2 A (B :*: C) -- not really but you get the idea
A64m
это точно? что кроме анпака там на представление влияет?
Vladislav
наверняка в один Generic раскроется
Vladislav
Или там будет вот это поле обернуто в какой-нибудь K?
A64m
нет, будет метой отличаться, он для вложенного конструктора метаинформацию добавит же
Vladislav
понял
Vladislav
ну тогда да, можно реассоциировать и будет работать
Vladislav
лучше бы сразу generics-sop были, а не эти вложенные страсти
Vladislav
А, ну в общем-то можно для структурной эквивалентности брать https://hackage.haskell.org/package/generics-sop-0.3.2.0/docs/Generics-SOP.html#t:Code и сравнивать
Vladislav
прям посредством ==
Vladislav
structuralCast :: (Code a == Code b) ~ True => a -> b structuralCast = unsafeCoerce
Vladislav
Хотя это всякие ньютайпы не снимет, надо вместо == пройтись по этим кодам и раскрыть все это в Coercible-констрейнты
M
лол
Alexander
исчез..
Влод
ахах
Dmitry
бесполезно. но вообще настроить автоматический бан по длине ника - не самая плохая идея
Dmitry
ну или длине/частотам - скормить какой-нить нейросетке или тупо в knn
Зигохистоморфный
подскажите, как сделать, чтобы пустой массив тоже парсился? P.parse (P.between (P.char '[') (P.char ']') $ P.sepBy P.anyChar (P.char ',')) "" "[]"
Ilya
мне кажется anyChar консьюмит ']'
Ilya
и всё взрывается
Ilya
это парсек?
Ilya
можно заменить P.anyChar на P.noneOf "]"?
Зигохистоморфный
можно заменить P.anyChar на P.noneOf "]"?
[1,2,3] но надо и такое парсить например
Ilya
ну оно будет парситься же
Ilya
там даже наверное нужно будет P.noneOf "],"
Зигохистоморфный
ну оно будет парситься же
напиши весь код) я чот под вечер не догоняю
Ilya
P.parse (P.between (P.char '[') (P.char ']') $ P.sepBy (many $ P.noneOf "],") (P.char ',')) "" "[]"
Зигохистоморфный
P.parse (P.between (P.char '[') (P.char ']') $ P.sepBy (many $ P.noneOf "],") (P.char ',')) "" "[]"
я если мне надо какой-то специфичный парсер отличный от anyChar
Ilya
ну с большой степенью вероятности этот парсер не будет ожидать первым символом , или ] и всё будет работать
кана
длинный ник не значит реклама
кана
а банить человека за просто длинный ник это шиза какая-то
кана
потом будем черных банить
Зигохистоморфный
ну с большой степенью вероятности этот парсер не будет ожидать первым символом , или ] и всё будет работать
``` P.parse (P.between (P.char '[') (P.char ']') $ P.sepBy ((many $ P.noneOf "],") <|> myParser)(P.char ',')) "" "[]" ```
Igor
потом будем черных банить
И с анимешными аватарками 🌝
Зигохистоморфный
что если так?
Ilya
да скорее всего тебе это не нужно, просто myParser оставь
кана
И с анимешными аватарками 🌝
а у меня аватарка с реальным мной)
Зигохистоморфный
Ilya
да пофиг
Ilya
это уже захендлит sepBy
Антон
а у меня аватарка с реальным мной)
А, так вот что это за андрогинный юноша
Ilya
если твой парсер не законсьюмит запятую или скобочку
Alexander
а у меня аватарка с реальным мной)
да я видел, когда брагилевский фоткал аудиторию, там был человек как на аватарке
Alexander
в парсере просто парсер элемента не должен считать ] подходящим символом
Зигохистоморфный
да пофиг
noneOf "[," есть anyToken без [ или ,?
Ilya
да
Alexander
просто anyChar-ом внутри собирать - это так себе идея
Зигохистоморфный
хм, а как lookAhead использовать?
Alexander
это который следующий токен берет или вообще вверх без консьюма смотрит?
кана
мы с тобой стояли после лекций, я такси ждал
кана
ну ясно все
Alexander
я знаю
Alexander
я конечно людей не очень запоминаю, но не настолько же
Alexander
у меня несерьёзные комментарии что-ли настолько неочевидных?
Ilya
хм, а как lookAhead использовать?
ты уверен, что оно тебе надо?
Ilya
как минимум в озвученной задаче это не выглядит необходимым
Алексей ayaye :)
lookAhead по идее нужен, когда грамматика локально выходит за рамки класса, с которым умеет штатно работать конкретный генератор парсеров. например, грамматрика везде LL(1), а вот тут - 3, то есть, решение на основе одного следующего токена принять нельзя, надо посмотреть на 3. Или вообще попробовать распарсить на неизвестное количество токенов и на основе результата принять решение.
A64m
ошибка
Антон
а какая разница? понятие lookahead от языка не зависит
Это я к тому, что в C и C++ настолько дурацкая грамматика, что для корректного парсинга может потребоваться неограниченный в теории lookahead. И ещё в этих языках парсер обращается к тайпчекеру, потому что без этого некоторые конструкции не в состоянии распарсить
Cheese
вроде как раз С легко парсить, это С++ страшен
Cheese
Оператор запятая
ты не можешь по предшествующему коду её отличить от аргументов функции или как?
Антон
Ну и типы функций в аргументах читаются по спирали
Maxim
интересно, есть линзы из тип суммы и можно ли как-то сделать view (l1 or l2 or l3)? чтобы выбирать линзу как-то автоматически
я решил эту задачу для себя так: ```pre (l1 `failing l2 failing` l3) . non (error "impossible")```, потому что уверен, что `l1, l2, l3` дизъюнктны и покрывают всю возможную область