
Dmitry
09.02.2018
14:13:58
просто сделал ADT

Leonid
09.02.2018
14:14:01

kana
09.02.2018
14:14:11
а, ну так free и не дсл для генерации кода, это дсл для описания алгоритма (последовательности команд, в том числе и нелинейного), которая потом выполняется, а не что-то генерирует

Dmitry
09.02.2018
14:14:11
и потом его обхожу и делаю то, что мне надо - хочу интерпретирую

Google

Dmitry
09.02.2018
14:14:15
хочу генерирую другой ADT
то никаких ограничений у меня нет ни на что
что бы конструирование ADT было приятным и выглядело как некий edsl - это все заворачивается в монадические функции

Александр
09.02.2018
14:14:55

Denis
09.02.2018
14:14:56

Denis
09.02.2018
14:15:04
в общем есть мнение такое, что если вам абстракция по функтору f не нужна из Free f a, то нафиг вам в вашем конкретном случае фри-монады не нужны

Dmitry
09.02.2018
14:15:24
мы не знаем, нужна она нам или нет
т.к. цель не получить абстракцию по функтору

Leonid
09.02.2018
14:15:38

Dmitry
09.02.2018
14:15:40
а получить код, который что-то полезное делает
точнее даже так - получить что-то полезное.

Denis
09.02.2018
14:15:55

Dmitry
09.02.2018
14:15:58
лучше , если кода при этом будет меньше

Google

Dmitry
09.02.2018
14:16:02
или не будет совсем

Александр
09.02.2018
14:16:09

Dmitry
09.02.2018
14:16:28
последние три - это чистая вкусовщина
никогда не знаешь, кому что легко читается понимается и изменяется
субъективно.

Denis
09.02.2018
14:17:01
на полуфабрикат похоже

Александр
09.02.2018
14:17:33
Если нужно чистым образом заимплементить императивные по сути сценарии предметной области (взять/положить в БД, дернуть сервис...), то фри монады - правильное решение.

Alister
09.02.2018
14:17:37
что думаете про ReasonML?

Leonid
09.02.2018
14:17:40

Dmitry
09.02.2018
14:17:56
почему эти сценарии нельзя реализовать просто функцией?

Denis
09.02.2018
14:18:13
@voidlizard в плане вообще всяких своих языков лучше юзать алгебры различные и сворачивать все единой сверткой опрелеленной через общий интерфейс
https://gist.github.com/xgrommx/4c72ae9d407214deab55fe9aebc08b45#file-hrecursionschemes-hs-L83-L105

Leonid
09.02.2018
14:18:16

Dmitry
09.02.2018
14:19:05
@xgrommx а точно лучше? чем, например, просто преобразование.

Denis
09.02.2018
14:19:08
ну все, я готов кибербуллить

Denis
09.02.2018
14:19:44
и вот всякие переходы от ввода пользователя в ast это некий анаморфизм, а интерпретация или преобразования - некий катаморфизм

Александр
09.02.2018
14:21:19
почему эти сценарии нельзя реализовать просто функцией?
Это в любом случае будут функции. У нас же ФП. Но дополнительный уровень абстракции - возможность интерпретации - позволяет делать всякие полезные штуки. Например, в интерпретаторе на каждый метод добавить логгирование. У вас в сценарии не будет лишних команд для логгирования, а логгироваться будет. Или другой кейс (реальный): сценарии возобновляемые. То есть, сценарии выглядят обычно, а вот интерпретатор умеет останавливаться и персистить промежуточные данные в БД. Можно даже сервер перезапустить.

kana
09.02.2018
14:22:12

? animufag ?
09.02.2018
14:22:30

Google

Dmitry
09.02.2018
14:23:53
Александр отчасти принято, но может быть реализовано не только фримонадами, но, например, тайпклассами или передачей словарей
но и то, и другое налагает ограничения на разработчика
довольно искусственные

Александр
09.02.2018
14:24:51
А чем на тайпклассах то грязно?
Много про детали реализации видно, когда на них прогаете. Много лишнего писать. Но это, конечно, нельзя померить объективно.

kana
09.02.2018
14:25:19
фри-монады попросту удобно использовать, там куча всего генерируется, нужно только интерпретатор писать от руки

A64m
09.02.2018
14:25:25

Dmitry
09.02.2018
14:25:46
@kana_sama реквестирую больше примеров, где это удобно

Alister
09.02.2018
14:25:47
а у Окамла красивый?

Denis
09.02.2018
14:26:01

A64m
09.02.2018
14:26:13

Dmitry
09.02.2018
14:26:13
@kana_sama я как увижу какой-то профит, сразу же внедрю

kana
09.02.2018
14:26:34

Alister
09.02.2018
14:26:39
я раньше думал у хаскеля фиговый

Александр
09.02.2018
14:26:44
Окей, мы пришли к какому-то консенсусу, поэтому здесь остагавливаюсь, чтобы впечатлительных на кибербулинг не провоцировать.

Alister
09.02.2018
14:26:57
но потом увидел F# и MLи

Dmitry
09.02.2018
14:27:01
@kana_sama да, я хочу видеть, где фримонады сокращают бойлерплейт, а не увеличивают его

A64m
09.02.2018
14:27:07

Dmitry
09.02.2018
14:27:28
@kana_sama в идеале одно и тоже на них, и без них

Denis
09.02.2018
14:28:03

Google

Denis
09.02.2018
14:29:02

A
09.02.2018
14:29:08
ребят, кто говорил что-то вроде "Для каждой задачи свой язык"?

Александр
09.02.2018
14:29:25

kana
09.02.2018
14:29:35
@kana_sama да, я хочу видеть, где фримонады сокращают бойлерплейт, а не увеличивают его
окей, начнем с того, что DeriveFunctor (какой бы он не был медленный) генерит функтор по adt T, уже минус описание функтора. makeFree в пакете free тоже генерирует все смарт-конструкторы для Free T. Ну а Free дает еще и инстанс монады.
Вручную остается писать только ровно один интерпретатор - это в прямом смысле только тот код, который реализуется за каждой командой дслки, то есть меньше и придумать нельзя
С тайпклассами это будет реализация инстанса, то есть столько же кода

Dmitry
09.02.2018
14:29:35
ну т.е еще раз, мой типичный способ сделать некий edsl - это при помощи монадических функций, сгенерировать нечто, потом это нечто интерпретировать. бойлеплейта здесь - сам тип нечта, и функции для его конструирования

A64m
09.02.2018
14:29:56

Dmitry
09.02.2018
14:30:05
из минусов - или писать монаду самому, или незаконно использовать Writer

A
09.02.2018
14:30:41

Dmitry
09.02.2018
14:30:44
зато ADT может быть вообще любым.

A
09.02.2018
14:30:56
не могу вспомнить как этот проект назывался

kana
09.02.2018
14:31:03

Alexander
09.02.2018
14:31:19
DSL хорошо, но DSL /= Free monad

Dmitry
09.02.2018
14:31:21
ну хорошо, где-то можно увидеть moar примеров?

Alexander
09.02.2018
14:31:29
удачных применений Free я не видел

Dmitry
09.02.2018
14:31:37
лучше "вот без фримонады было плохо, а теперь стало хорошо"

Alexander
09.02.2018
14:31:52
где были, оно безбожно тормозит, а то ради чего оно нужно и не применяется вовсе

Andrei
09.02.2018
14:31:55

Dmitry
09.02.2018
14:32:07
типично там надо написать столько всякой другой хрени, что бы это работало, что просто руками написать бойлерплейт зачастую - меньше.

Александр
09.02.2018
14:32:13

Alexander
09.02.2018
14:32:15
т.е. добавить логирование, сделать интерпретатор рисующий схему и запускающий и т.п.

Google

Dmitry
09.02.2018
14:32:24
ну т.е фримонады это хорошо, но власти скрывают

Denis
09.02.2018
14:32:29
@voidlizard кстати примеры от небезызвестного Николая Кудасова
https://gist.github.com/fizruk/5555588
https://gist.github.com/fizruk/5555561

kana
09.02.2018
14:32:31
https://gist.github.com/kana-sama/658ccb7b0d0bb6a10f9bcb55f04c3941 - очень давно я писал этот примитивный пример, он мне еще и не нравится из-за того, что там интерпретатор не через foldF (и поэтому там рекурсивный run), но можно увидеть всю генерацию

Alexander
09.02.2018
14:32:35
в итоге вместо всего этого есть только запускатор, и кусочки остального
хотя вон в funcflow вообще freer arrows
т.е. зачем оно нужно и когда выстреливает - более менее понятно

Dmitry
09.02.2018
14:34:14
по ссылке с балансами я вижу способ реализовать интерпретатор, но не вижу чем это отличается от рекурсивного обхода обычного ADT

kana
09.02.2018
14:35:00
нет бойлерплейта для смарт-конструкторов, монадного инстанса

Александр
09.02.2018
14:36:32
ну т.е фримонады это хорошо, но власти скрывают
Ну, не совсем. Моя индусская компания Juspay (не моя, а где я работал), выложила Presto core фреймворк, который я им написал. (Ищите на гитхабе) Но применений там нет, конечно. В то же время они для своего продукта написали на нем фичи и хотят дальше портировать имеющийся хаскельный (пьюрескритный точнее) код. А второй проект, который я для них сделал - сервер обобщенных workflow, которые могут персиститься в бд на любой точке исполнения, запускаться на имеющихся серверах автоматически, а сценарии могут поставлять внешние заказчики.

kana
09.02.2018
14:36:33
это все и есть обычный обход ADT, только если мы напишем 3 таких обходера, мы увидим общий код, который мы вынесем и получим free

Dmitry
09.02.2018
14:36:34
charge
- делается при помощи
makeFree ''BillingProgramF
?

kana
09.02.2018
14:36:46

Dmitry
09.02.2018
14:37:32
но и ограничения тоже получаем

kana
09.02.2018
14:38:03
например? Какие-то ограничения мы получаем наверняка, но сходу я назвать их не могу

Dmitry
09.02.2018
14:38:33
например, всё то же пенальти edsl - управляющие конструкции не являются частью типа и не конструируются. т.е они работают во время конструирования
так?
если нам надо создать тип вместе с ними

kana
09.02.2018
14:38:48
в моем примере неканоничный run, в идеале это должно быть натуральное преобразование через свертку
они работают во времени выполнения