Dmitry
зато ADT может быть вообще любым.
Андрей
не могу вспомнить как этот проект назывался
кана
Alexander
DSL хорошо, но DSL /= Free monad
Dmitry
ну хорошо, где-то можно увидеть moar примеров?
Alexander
удачных применений Free я не видел
Dmitry
лучше "вот без фримонады было плохо, а теперь стало хорошо"
Alexander
где были, оно безбожно тормозит, а то ради чего оно нужно и не применяется вовсе
Dmitry
типично там надо написать столько всякой другой хрени, что бы это работало, что просто руками написать бойлерплейт зачастую - меньше.
Alexander
Alexander
т.е. добавить логирование, сделать интерпретатор рисующий схему и запускающий и т.п.
Dmitry
ну т.е фримонады это хорошо, но власти скрывают
Зигохистоморфный
@voidlizard кстати примеры от небезызвестного Николая Кудасова
https://gist.github.com/fizruk/5555588
https://gist.github.com/fizruk/5555561
кана
https://gist.github.com/kana-sama/658ccb7b0d0bb6a10f9bcb55f04c3941 - очень давно я писал этот примитивный пример, он мне еще и не нравится из-за того, что там интерпретатор не через foldF (и поэтому там рекурсивный run), но можно увидеть всю генерацию
Alexander
в итоге вместо всего этого есть только запускатор, и кусочки остального
Alexander
хотя вон в funcflow вообще freer arrows
Alexander
т.е. зачем оно нужно и когда выстреливает - более менее понятно
Dmitry
по ссылке с балансами я вижу способ реализовать интерпретатор, но не вижу чем это отличается от рекурсивного обхода обычного ADT
кана
нет бойлерплейта для смарт-конструкторов, монадного инстанса
Alexander
ну т.е фримонады это хорошо, но власти скрывают
Ну, не совсем. Моя индусская компания Juspay (не моя, а где я работал), выложила Presto core фреймворк, который я им написал. (Ищите на гитхабе) Но применений там нет, конечно. В то же время они для своего продукта написали на нем фичи и хотят дальше портировать имеющийся хаскельный (пьюрескритный точнее) код. А второй проект, который я для них сделал - сервер обобщенных workflow, которые могут персиститься в бд на любой точке исполнения, запускаться на имеющихся серверах автоматически, а сценарии могут поставлять внешние заказчики.
кана
это все и есть обычный обход ADT, только если мы напишем 3 таких обходера, мы увидим общий код, который мы вынесем и получим free
Dmitry
charge
- делается при помощи
makeFree ''BillingProgramF
?
кана
Dmitry
но и ограничения тоже получаем
кана
например? Какие-то ограничения мы получаем наверняка, но сходу я назвать их не могу
Dmitry
например, всё то же пенальти edsl - управляющие конструкции не являются частью типа и не конструируются. т.е они работают во время конструирования
Dmitry
так?
Dmitry
если нам надо создать тип вместе с ними
кана
в моем примере неканоничный run, в идеале это должно быть натуральное преобразование через свертку
кана
кана
они работают во времени выполнения
кана
кана
как бы этот when бы сработал во время конструирования
Зигохистоморфный
если нам нужен подязык (ограниченный) то Free monad
если же нам нужен полноценный язык в языке программирования то рекурсивные схемы, алгебры и так далее
кана
там можно написать
if balance > 100
then done
else pure ()
это обычный монадный when
Alexander
если нам нужно пространство для оптимизации нахаляву то Freer, если очень много - то Free
Dmitry
окей, функция example - конструирует или выполняет?
Зигохистоморфный
тем более фримонады тоже можно сворачивать катаморфизмами используя как базовый функтор FreeF для неподвижной точки Free
Dmitry
@qnikst так, халява есть во Freer ?
Alexander
и там и там
Alexander
но просто Freer тормозит, а Free ТОРМОЗИТ
Dmitry
а почему?
Alexander
и это красивее, чем threadDelay 100 по всей программе расставить и потом удалять по 10 за спринт
Alexander
@voidlizard особенности реализации
Alexander
вообще Free(r) прикольная тем
Alexander
тема
Dmitry
пока всей обнаруженной халявы это отсутствие необходимости писать монадические конструкторы
Alexander
но как-то случаев где это действительно надо не то чтобы миллионы
Dmitry
но это блин такая мелочь по сравнению с остальным.
Alexander
окей, функция example - конструирует или выполняет?
Мне не очень ясен сам вопрос. Но в DSL есть только то, что есть в вашем соответствующем типе. И только это можно интерпретировать/преобразовывать/etc. Если хотите что-то еще преобразовывать (условные конструкции и т.п), это нужно вносить в ваш язык.
Alexander
мне чаще разные dsl надо композить
Alexander
как это делать с Free я не знаю
Alexander
поверх datatypes la carte делать свободные структуры?
Dmitry
Александр ну конечно, хочу преобразовывать
Alexander
спасибо, я их и так не осилил
Dmitry
как правило это всегда нужно
Dmitry
несколько примеров прямо таки в статье про поиски жирного, которую я постил
Dmitry
у и там типичная ситуация
Alexander
mtl/final tagless это позволяет композить
Alexander
Зигохистоморфный
Alexander
больше mental work, for no reason
Dmitry
еще раз - весь этот угар, что бы монадические конструкторы не писать?
Alexander
если действительно, нужны разные интерпретаторы, то имеет смысл об этом думать
Зигохистоморфный
Alexander
но обычно это не нужны разные интепретаторы, а ЗАТО МЫ МОЖЕМ ДЕЛАТЬ РАЗНЫЕ ИНТЕРПРЕТАТОРЫ
Alexander
т.е. обобщение ради обобщения
Dmitry
да, потому чт обычно нужен конструктор (парсер), оптимизатор, валидатор, генератор
Dmitry
констант пропагатор
Dmitry
дед код элиминатор
Dmitry
тэйл колл оптимизатор
Dmitry
ну так далее, и так далее
Dmitry
коммон код обобщатор