Андрей
в интернетах - каждый второй, но имена они часто скрывают, чтоб не засмеяли
вроде Алан Кей, но я что-то нагуглить не могу сайт где он ОС из кучи самопальных языков написал
Dmitry
зато ADT может быть вообще любым.
Андрей
не могу вспомнить как этот проект назывался
Alexander
DSL хорошо, но DSL /= Free monad
Dmitry
ну хорошо, где-то можно увидеть moar примеров?
Alexander
удачных применений Free я не видел
Dmitry
лучше "вот без фримонады было плохо, а теперь стало хорошо"
Alexander
где были, оно безбожно тормозит, а то ради чего оно нужно и не применяется вовсе
Andrei
я раньше думал у хаскеля фиговый
я тоже так думал, потом познакомился с х-лем поближе, порефлексировал, и решил, что синтаксис таки очень годный.
Dmitry
типично там надо написать столько всякой другой хрени, что бы это работало, что просто руками написать бойлерплейт зачастую - меньше.
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
а почему?
Зигохистоморфный
@qnikst так, халява есть во Freer ?
ну Freer это Coyoneda + Free а значит это бесплатный и функтор и монада
кана
окей, функция example - конструирует или выполняет?
конструирует, но после каждого bind, который отдает значение из интерпретатора (читаем из базы), конструирование откладывается до получения значения
Alexander
и это красивее, чем threadDelay 100 по всей программе расставить и потом удалять по 10 за спринт
Alexander
@voidlizard особенности реализации
Alexander
вообще Free(r) прикольная тем
Alexander
тема
Dmitry
пока всей обнаруженной халявы это отсутствие необходимости писать монадические конструкторы
Alexander
но как-то случаев где это действительно надо не то чтобы миллионы
Dmitry
но это блин такая мелочь по сравнению с остальным.
Alexander
окей, функция example - конструирует или выполняет?
Мне не очень ясен сам вопрос. Но в DSL есть только то, что есть в вашем соответствующем типе. И только это можно интерпретировать/преобразовывать/etc. Если хотите что-то еще преобразовывать (условные конструкции и т.п), это нужно вносить в ваш язык.
Зигохистоморфный
вообще Free(r) прикольная тем
там же есть прокаченная версия очередей, что вроде ускоряет?
Alexander
мне чаще разные dsl надо композить
Alexander
как это делать с Free я не знаю
Alexander
поверх datatypes la carte делать свободные структуры?
Dmitry
Александр ну конечно, хочу преобразовывать
Alexander
спасибо, я их и так не осилил
Dmitry
как правило это всегда нужно
Dmitry
несколько примеров прямо таки в статье про поиски жирного, которую я постил
Dmitry
у и там типичная ситуация
Alexander
но просто Freer тормозит, а Free ТОРМОЗИТ
Достаточно для того, чтобы на серверном purescript-коде исполнять сотни операций в секунду
Alexander
mtl/final tagless это позволяет композить
Alexander
кана
mtl/final tagless это позволяет композить
так FreeT есть, композить несколько дслек не сложно
Зигохистоморфный
Alexander
больше mental work, for no reason
Dmitry
еще раз - весь этот угар, что бы монадические конструкторы не писать?
Alexander
если действительно, нужны разные интерпретаторы, то имеет смысл об этом думать
Зигохистоморфный
Достаточно для того, чтобы на серверном purescript-коде исполнять сотни операций в секунду
у пурсы там все оптимизашки написаны для Free а это remorse и прочее
Alexander
но обычно это не нужны разные интепретаторы, а ЗАТО МЫ МОЖЕМ ДЕЛАТЬ РАЗНЫЕ ИНТЕРПРЕТАТОРЫ
Alexander
т.е. обобщение ради обобщения
Dmitry
да, потому чт обычно нужен конструктор (парсер), оптимизатор, валидатор, генератор
Dmitry
констант пропагатор
Dmitry
дед код элиминатор
Dmitry
тэйл колл оптимизатор
Dmitry
ну так далее, и так далее
Dmitry
коммон код обобщатор