Dmitry
еще хуже
кана
фри это не аст, это ленивая последовательность команд, где каждый n+1 элемент может зависить от результата выполнения 0..n
Alexander
Не хотите фри монады, - можно и без них. Можно выразить предметную область типами и чистыми значениями. А потом в рантайме собирать из этого все, что вам нужно
Dmitry
@kana_sama как мне сделать так, что из этого кода на фримонадах сгенерировать нечто (вместе с ифами), оптимизировать, сгенерить из результата - скажем - код на си?
Dmitry
Александр это называется "написать программу на хаскелле"
Зигохистоморфный
Leonid 🦇
Dmitry
да, я вот пытаюсь найти это предметную область фримонад
Dmitry
оказывается, оно чуть-чуть в сторону и уже не область
кана
без понятия, слишком сложный запрос для меня, я лишь расписал, почему во фри есть if, потому что судя по "во фри нет ветвления" у тебя сложилось неверное понимание того, что есть фри (еще раз, это не аст)
Dmitry
ну вот это не if как первоклассное значение, скажем так
Dmitry
он работает на этапе конструирования - если код на фримонадах что-то конструирует
Dmitry
но в том, что он конструирует его уже нет
Dmitry
если же я забыл слово "фримонада"
Denis
в общем что я знаю про фри монады:
- ими можно пользоваться(никто не знает зачем)
- ими можно не пользоваться
- if в них работает обычный
Dmitry
просто сделал ADT
Leonid 🦇
кана
а, ну так free и не дсл для генерации кода, это дсл для описания алгоритма (последовательности команд, в том числе и нелинейного), которая потом выполняется, а не что-то генерирует
Dmitry
и потом его обхожу и делаю то, что мне надо - хочу интерпретирую
Dmitry
хочу генерирую другой ADT
Dmitry
то никаких ограничений у меня нет ни на что
Dmitry
что бы конструирование ADT было приятным и выглядело как некий edsl - это все заворачивается в монадические функции
Alexander
Зигохистоморфный
Denis
в общем есть мнение такое, что если вам абстракция по функтору f не нужна из Free f a, то нафиг вам в вашем конкретном случае фри-монады не нужны
Dmitry
мы не знаем, нужна она нам или нет
Dmitry
т.к. цель не получить абстракцию по функтору
Leonid 🦇
Dmitry
а получить код, который что-то полезное делает
Dmitry
точнее даже так - получить что-то полезное.
Зигохистоморфный
Dmitry
лучше , если кода при этом будет меньше
Dmitry
или не будет совсем
Dmitry
последние три - это чистая вкусовщина
Dmitry
никогда не знаешь, кому что легко читается понимается и изменяется
Dmitry
субъективно.
Denis
на полуфабрикат похоже
Alexander
Если нужно чистым образом заимплементить императивные по сути сценарии предметной области (взять/положить в БД, дернуть сервис...), то фри монады - правильное решение.
Aliester
что думаете про ReasonML?
Leonid 🦇
Dmitry
почему эти сценарии нельзя реализовать просто функцией?
Зигохистоморфный
@voidlizard в плане вообще всяких своих языков лучше юзать алгебры различные и сворачивать все единой сверткой опрелеленной через общий интерфейс
https://gist.github.com/xgrommx/4c72ae9d407214deab55fe9aebc08b45#file-hrecursionschemes-hs-L83-L105
Leonid 🦇
Leonid 🦇
Dmitry
@xgrommx а точно лучше? чем, например, просто преобразование.
Denis
ну все, я готов кибербуллить
Зигохистоморфный
и вот всякие переходы от ввода пользователя в ast это некий анаморфизм, а интерпретация или преобразования - некий катаморфизм
Alexander
почему эти сценарии нельзя реализовать просто функцией?
Это в любом случае будут функции. У нас же ФП. Но дополнительный уровень абстракции - возможность интерпретации - позволяет делать всякие полезные штуки. Например, в интерпретаторе на каждый метод добавить логгирование. У вас в сценарии не будет лишних команд для логгирования, а логгироваться будет. Или другой кейс (реальный): сценарии возобновляемые. То есть, сценарии выглядят обычно, а вот интерпретатор умеет останавливаться и персистить промежуточные данные в БД. Можно даже сервер перезапустить.
кана
Влод
Dmitry
Александр отчасти принято, но может быть реализовано не только фримонадами, но, например, тайпклассами или передачей словарей
Dmitry
но и то, и другое налагает ограничения на разработчика
Dmitry
довольно искусственные
Alexander
А чем на тайпклассах то грязно?
Много про детали реализации видно, когда на них прогаете. Много лишнего писать. Но это, конечно, нельзя померить объективно.
Alexander
кана
фри-монады попросту удобно использовать, там куча всего генерируется, нужно только интерпретатор писать от руки
Dmitry
@kana_sama реквестирую больше примеров, где это удобно
Aliester
а у Окамла красивый?
Зигохистоморфный
Dmitry
@kana_sama я как увижу какой-то профит, сразу же внедрю
Aliester
я раньше думал у хаскеля фиговый
Alexander
Окей, мы пришли к какому-то консенсусу, поэтому здесь остагавливаюсь, чтобы впечатлительных на кибербулинг не провоцировать.
Aliester
но потом увидел F# и MLи
Dmitry
@kana_sama да, я хочу видеть, где фримонады сокращают бойлерплейт, а не увеличивают его
A64m
Dmitry
@kana_sama в идеале одно и тоже на них, и без них
Зигохистоморфный
Зигохистоморфный
Андрей
ребят, кто говорил что-то вроде "Для каждой задачи свой язык"?
Alexander
кана
@kana_sama да, я хочу видеть, где фримонады сокращают бойлерплейт, а не увеличивают его
окей, начнем с того, что DeriveFunctor (какой бы он не был медленный) генерит функтор по adt T, уже минус описание функтора. makeFree в пакете free тоже генерирует все смарт-конструкторы для Free T. Ну а Free дает еще и инстанс монады.
Вручную остается писать только ровно один интерпретатор - это в прямом смысле только тот код, который реализуется за каждой командой дслки, то есть меньше и придумать нельзя
С тайпклассами это будет реализация инстанса, то есть столько же кода
Dmitry
ну т.е еще раз, мой типичный способ сделать некий edsl - это при помощи монадических функций, сгенерировать нечто, потом это нечто интерпретировать. бойлеплейта здесь - сам тип нечта, и функции для его конструирования
Dmitry
из минусов - или писать монаду самому, или незаконно использовать Writer