@haskellru

Страница 831 из 1551
Dmitry
09.02.2018
14:13:58
просто сделал ADT

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 - это все заворачивается в монадические функции

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

Dmitry
09.02.2018
14:15:24
мы не знаем, нужна она нам или нет

т.к. цель не получить абстракцию по функтору

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

точнее даже так - получить что-то полезное.

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?

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

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
почему эти сценарии нельзя реализовать просто функцией?
Это в любом случае будут функции. У нас же ФП. Но дополнительный уровень абстракции - возможность интерпретации - позволяет делать всякие полезные штуки. Например, в интерпретаторе на каждый метод добавить логгирование. У вас в сценарии не будет лишних команд для логгирования, а логгироваться будет. Или другой кейс (реальный): сценарии возобновляемые. То есть, сценарии выглядят обычно, а вот интерпретатор умеет останавливаться и персистить промежуточные данные в БД. Можно даже сервер перезапустить.

? 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
что думаете про ReasonML?
окамл со страшным синтаксисом, со всеми вытекающими?

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
@kana_sama реквестирую больше примеров, где это удобно
показать примеры, где генерация кода (то есть не писать вручную бойлерплейт) удобна?

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 в идеале одно и тоже на них, и без них

Google
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
не могу вспомнить как этот проект назывался

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 ?

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, в идеале это должно быть натуральное преобразование через свертку

они работают во времени выполнения



Страница 831 из 1551