Aleksei
Давай
Aleksei
Спокойной ночи
Aleksei
Я че то залип
Aleksei
В размышлениях
A64m
Ага, верно.
как тут примерно https://gist.github.com/nkpart/c3bcb48c97c5ded6e277#file-err-hs-L13
Aleksei
Дмитрий Taras Serduke это ты? -)
Дмитрий
Я точно не Тарас :))
Aleksei
Ладно, не суть важно. Код прикольный
Aleksei
я чет не уловил как он к теме относится просто
Aleksei
либа вообще класс. идея
Aleksei
но если бы чювак хоть раз работал на джава или других строго типизированнвх языках
Aleksei
то он бы понял что автокомплит врпинципе неплох
Aleksei
и этим джава лучше руби, например
Aleksei
я к тому что
Aleksei
не стоит заводить полностью свой словарь
Aleksei
есть определенное сообщество
Aleksei
есть такая прекрасная либа
Aleksei
http://www.functionaljava.org/
Aleksei
но она не прижилась
Aleksei
потому что как и в скала, там свои коллекции
Aleksei
свои идеи
Слава
Dmitry
Еще и упрощённая версия показана, как будто мы тут сложных вещей не понимаем
Anonymous
Alexander
Дмитрий
Взять структуру скобками и поменять в ней какой-то кусок чем-то походим на map, например, имена.
Первое, что в головуц приходит.
Alexander
Дмитрий
Не очень это мягко сказано, но может я что-то упустил?
Мне хотелось бы видеть функцию с типо f: (a->b) -> Epx -> Exp,
Для примеру... не знаю, думаю пока.
Alexander
в зависимости от того, что такая функция делает большой сложности написать я не вижу
Alexander
но с другой стороны это абуз TH какой-то
Дмитрий
Да собственно это действительно не сложно (по крайней мере концептуально), я просто не дозрел пока, чтобы сесть писать свой набор инструментов для работы с AST.
A64m
A64m
Дмитрий
Дмитрий
Я в TH не слишком глубоко, просто решаю прикладные задачи и подбираю набор инструментов, с которым это будет делать комфортнее всего.
Alexander
это не про ТН а про хаскель в принципе
A64m
ну вот линзовые дженерики https://hackage.haskell.org/package/lens-4.15.4/docs/Control-Lens-Plated.html со всякими обобщенными переписываниями деревьев, там же инстансы для ТХ
Alexander
есть генерик инстанс описывающий любоэую структуру через базовую
Alexander
и можно работать с базовой
A64m
но я тек и не понял, почему для обсуждаемого случая уже готовое для класси-призм нельзя использовать
Alexander
есть другие менее нативные подходы гбхожк любой структуры типа syb
Alexander
по названиям выше смотрите пакет на хакадже
Alexander
там статьи и документацию
Дмитрий
Благодарю...
Alexander
вон например в inline-r мы генерим Haskell код по аст которое вернул R
Alexander
через ТН можно по похожему принципу идти, там через lift-th
Alexander
syb и прочие работают как обобщенный проход по аст, например можно найти паттерн и переписать его на другой и далее по дереву, ну и куча хелперов дальше, прочти снизу вверх, сверху вниз или в обе стороны пока не сойдется
Alexander
например hlint пакет основан на таком принципе, он правда свое представление обходит, а не представление TH но принципиальной разницы нет
Alexander
если это для A | B, то я не уверен, что игра стоит свеч, конечно, можно улучшить матчинг такой структуры с помощью TH, но как-то это печально все равно
Alexander
хотя вроде OpenUnion через Here a | There (OU as) можно полноценно матчить
Vladislav
Надо бы добавить паттерн-синонимы OU1, OU2, OU3, etc
Vladislav
в пакет мне
Vladislav
https://github.com/int-index/union/issues/8
Vladislav
И матчить так:
case u of
OU1 a -> ...
OU2 b -> ...
OU3 c -> ...
Vladislav
А еще можно поэкспериментировать с type-indexed паттернами, чтобы было вроде
case u of
OU (a :: Integer) -> ...
OU (b :: Bool) -> ...
OU (c :: Char) -> ...
Vladislav
Правда мне кажется, что с exhaustiveness-чекером тут не договоришься
Дмитрий
Vladislav
Не хранит
Vladislav
Но там не просто так OU написано :)
Alexander
Alexander
а с сетами не удобно что я не знаю разумного способа жить с перестановками элементов
Vladislav
В общем я сделал OU, а не exhaustiveness придется забить
Vladislav
pattern OU :: UElem a as (RIndex a as) => a -> OpenUnion as
pattern OU a <- (preview openUnion -> Just a)
where OU a = review openUnion a
Vladislav
Блин, бенчмарки не работают почему-то
Vladislav
Benchmark bench: RUNNING...
benchmarking openUnion matching 1st
time 4.897 ns (4.892 ns .. 4.905 ns)
bench: <stdout>: commitBuffer: invalid argument (invalid character)
1.000 RBenchmark bench: ERROR
Vladislav
что это вообще такое
Alexander
ТН могло бы помочь
Vladislav
С чем?
Vladislav
Ты предлагаешь каждый кейс генерить?
Alexander
т.е. если у тебя есть split возвращающий элемент или сет без этого типа
Vladislav
Есть такой, да
Alexander
тогда вложенные матчи чнкаются
Зигохистоморфный
Alexander
но писать это руками не хочется
Vladislav
чтобы разный код на матчинг/конструкцию
Vladislav
Alexander
так вот с помощью ТН можно было бы переводить у удобную форму ну или плагином