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 "]"?
Зигохистоморфный
Ilya
ну оно будет парситься же
Ilya
там даже наверное нужно будет P.noneOf "],"
Ilya
P.parse (P.between (P.char '[') (P.char ']') $ P.sepBy (many $ P.noneOf "],") (P.char ',')) "" "[]"
Зигохистоморфный
кана
Ilya
ну с большой степенью вероятности этот парсер не будет ожидать первым символом , или ] и всё будет работать
кана
длинный ник не значит реклама
кана
а банить человека за просто длинный ник это шиза какая-то
кана
потом будем черных банить
Зигохистоморфный
что если так?
Ilya
да скорее всего тебе это не нужно, просто myParser оставь
Зигохистоморфный
Ilya
да пофиг
Ilya
это уже захендлит sepBy
Ilya
если твой парсер не законсьюмит запятую или скобочку
Alexander
в парсере просто парсер элемента не должен считать ] подходящим символом
Зигохистоморфный
да пофиг
noneOf "[," есть anyToken без [ или ,?
Ilya
да
Alexander
просто anyChar-ом внутри собирать - это так себе идея
Зигохистоморфный
хм, а как lookAhead использовать?
кана
Alexander
это который следующий токен берет или вообще вверх без консьюма смотрит?
кана
мы с тобой стояли после лекций, я такси ждал
кана
ну ясно все
Alexander
я знаю
Alexander
я конечно людей не очень запоминаю, но не настолько же
Alexander
у меня несерьёзные комментарии что-ли настолько неочевидных?
Ilya
Ilya
как минимум в озвученной задаче это не выглядит необходимым
Алексей ayaye :)
lookAhead по идее нужен, когда грамматика локально выходит за рамки класса, с которым умеет штатно работать конкретный генератор парсеров. например, грамматрика везде LL(1), а вот тут - 3, то есть, решение на основе одного следующего токена принять нельзя, надо посмотреть на 3. Или вообще попробовать распарсить на неизвестное количество токенов и на основе результата принять решение.
Антон
Алексей ayaye :)
A64m
Антон
а какая разница? понятие lookahead от языка не зависит
Это я к тому, что в C и C++ настолько дурацкая грамматика, что для корректного парсинга может потребоваться неограниченный в теории lookahead. И ещё в этих языках парсер обращается к тайпчекеру, потому что без этого некоторые конструкции не в состоянии распарсить
Cheese
вроде как раз С легко парсить, это С++ страшен
Антон
Cheese
Оператор запятая
ты не можешь по предшествующему коду её отличить от аргументов функции или как?
Антон
Антон
Ну и типы функций в аргументах читаются по спирали