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