@haskellru

Страница 816 из 1551
Dmitry
07.02.2018
15:03:52
не слишком впечатляло

Denis
07.02.2018
15:03:54
do-нотация из коробки, параметризуется функтором.

я тоже не пользуюсь, кстати

Dmitry
07.02.2018
15:04:31
ну вот, допустим

Google
Leonid
07.02.2018
15:04:46
в 95% случаев mtl-style заруливает фримонады

Dmitry
07.02.2018
15:04:58
нам нужно сделать некую нотацию, которая бы в зависимости от ситуации либо генерировала бы некий парсер, либо, наоборот, генератор

чего-то, что этот парсер должен уметь парсить

довольно типичная задача, вроде бы.

Denis
07.02.2018
15:05:34
Александр
07.02.2018
15:05:38
т.е то, о чем была статья - это просто реализация некоего Dsl, интерпретация которого могла меняться в зависимости от.
Да, но это не единственное преимущество. Можно инжектить зависимости, подменять имплементацию, использовать все монадические инструменты, тестировать. И при этом сам сценарий является чистым. Разделение: отдельно предметная область и сценарии, не имеющие эффектов, и одтельно интерпретаторы для разных окружений с эффектами. Ну то есть, интерфейс и реализация

Dmitry
07.02.2018
15:06:01
ну ок, есть какие-то короткие примеры, которые показывают, как работает этот подход?

Leonid
07.02.2018
15:06:20
я думаю тут только фри аппликативы могут
Вру, нужны моноеды и Control.Category. Я напиливал такое как-то. Ну и есть boomerang

Dmitry
07.02.2018
15:06:57
ну т.е прошу понять правильно - это все звучит очень похоже на просто dsl и просто его интерпретатор

и его монадический билдер

Александр
07.02.2018
15:07:14
ну ок, есть какие-то короткие примеры, которые показывают, как работает этот подход?
Я не знаю, короткие там или нет, но позвольте поделиться своим материалом. Я там стараюсь хорошо разложить по полочкам, что и для чего. https://drive.google.com/drive/folders/0B1Rdr1fbS6M9SjlKUk1zMVNjOVU

Google
Александр
07.02.2018
15:07:54
чем оно лучше mtl?
mtl захламляет код. А с Free-монадическим языком у вас, по сути, есть только предметная область.

Leonid
07.02.2018
15:08:33
mtl захламляет код обоснуйте

? animufag ?
07.02.2018
15:08:42
Александр
07.02.2018
15:08:44
Ну и mtl-style не интерпретируемый

Leonid
07.02.2018
15:09:20
Напиши другой инстанс - будет другой интерпретатор

Denis
07.02.2018
15:09:23
Leonid
07.02.2018
15:09:30
подменяй как хочешь

? animufag ?
07.02.2018
15:09:31
алсо хотелось бы услышать пример разных окружений в которых один и тот же код для dsl уместен

Александр
07.02.2018
15:09:42
ещё mtl вроде не занимается подменной имплементации
Есть паттерн, при котором можно инжектить зависимости, на самом деле. State monad injection, либо через тайпклассы

Dmitry
07.02.2018
15:09:47
@vlastachu +1

? animufag ?
07.02.2018
15:11:06
да

Александр
07.02.2018
15:11:06
В freer-языках мокать более нижние слои легко.

? animufag ?
07.02.2018
15:11:12
я про это и подумал

Александр
07.02.2018
15:11:20
Ну и окей, у меня есть еще один пример

Из практики.

Dmitry
07.02.2018
15:11:32
ну, например, ты сначала пишешь модель, модель моделирует, потом из модели генерируется что-то - например verilog

или сишный код

теоретически

Google
Dmitry
07.02.2018
15:11:58
практически.

? animufag ?
07.02.2018
15:12:06
но тут был чел который закинул ссылку на свои эффекты. и я у него спрсоил мол это для тестов/продакшенов и он такой неееее, не только

Dmitry
07.02.2018
15:12:19
ты пишешь сложную программу на некоем урезанном убогом языке необщего назначения

из которого теоретически генерируется си, и промело/спин, что бы этот си верифицировать

с одной стороны, у тебя есть хаскельные типы, но эти типы относятся к хаскелу, а не к твоей программе и генерируют дичайшие ошибки во время компиляции

которые с трудом мапятся на эту программу

Denis
07.02.2018
15:13:54
free отвечает за dsl cofree за интерпретатор

Dmitry
07.02.2018
15:13:54
ну это вообще судьба всех edsl

Александр
07.02.2018
15:14:02
Вот есть два реальных сервиса по изготовлению и треканию сетов-фактур (invoices): Infakt Zoho Я сделал freer-языки, абстрагирующие эти сервисы. https://gist.github.com/graninas/1dbe50fb7000f06cc1936768ff501cea

Denis
07.02.2018
15:14:14
free отвечает за dsl cofree за интерпретатор
http://dlaing.org/cofun/posts/free_and_cofree.html

Dmitry
07.02.2018
15:15:37
можно примеры использования этих типов?

Denis
07.02.2018
15:15:55
пора выкладывать свои подборки по free/freer (там много статей и материала)

Александр
07.02.2018
15:16:00
makeFreer?
Да, это реализация от "Takt, Inc": https://github.com/TaktInc/freer

Dmitry
07.02.2018
15:16:01
пора конечно

если есть, что выкладывать

Denis
07.02.2018
15:16:57
будет такой же лист как по рекурсивным схемам https://github.com/xgrommx/awesome-functional-programming/blob/master/rsfa.md

Александр
07.02.2018
15:17:51
можно примеры использования этих типов?
https://gist.github.com/graninas/5bd1e48b8b0b59e646e3d6f0c5ead745

Denis
07.02.2018
15:18:14
можно примеры использования этих типов?
у меня только когда я моделировал Free через Fix (по хорошему надо через Mu, это в будущем) есть пример для бреинфака)) https://gist.github.com/xgrommx/a92ef9d74e912c69128855589791c3e7

Google
Александр
07.02.2018
15:18:15
Зачем оно мою фотку сюда колбасиииит

можно примеры использования этих типов?
(Обновил гист, закопипастил несколько строчек из интерпретатора, но это уже очевидные вещи)

kana
07.02.2018
15:20:50
кучу Member можно на Members заменить

Dmitry
07.02.2018
15:21:00
окей, вижу брейнфак

Denis
07.02.2018
15:21:10
Dmitry
07.02.2018
15:21:20
теперь пытаюсь понять профит по сравнению с тем, как если бы мы сделали тоже самое без фри монад вообще.

kana
07.02.2018
15:21:25
или лучше на '[]
ну так Members '[] и использует

Александр
07.02.2018
15:22:01
или лучше на '[]
У нас еще не устоялись гайды. Но в данном случае на точный список лучше не менять. Точный список типов в другом месте у нас

* не использовать

kana
07.02.2018
15:22:23
type family Members ts r :: Constraint where Members '[] _ = () Members (t ': ts) r = (Member t r, Members ts r)

речь не про точный список

Александр
07.02.2018
15:22:48
А, тогда ясно

Да, можно было бы

Leonid
07.02.2018
15:23:26
теперь пытаюсь понять профит по сравнению с тем, как если бы мы сделали тоже самое без фри монад вообще.
optparse-applicative и digestive-functors на фри. но и тот и другой можно запилить через композицию аппликативов

Dmitry
07.02.2018
15:24:03
я правильно понимаю, что тоже самое можно было бы сделать просто определив тип (AST)

Denis
07.02.2018
15:24:04
@voidlizard мне почему-то казалось что Гонзалес все уже сказал что надо знать http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html

Dmitry
07.02.2018
15:24:11
и интерпретатор для значений этого типа

который делает то, что нам надо

Denis
07.02.2018
15:24:45
я правильно понимаю, что тоже самое можно было бы сделать просто определив тип (AST)
ну можно было AST + рекурсивные схемы, алгебры, но это уже больше чем просто dsl

Leonid
07.02.2018
15:25:04
Google
Leonid
07.02.2018
15:25:26
только писать меньше

Dmitry
07.02.2018
15:25:47
ну т.е

Александр
07.02.2018
15:25:56
и интерпретатор для значений этого типа
Можно было бы. Но не было бы монадического языка. Был бы просто язык.

Dmitry
07.02.2018
15:26:29
монадическим он становится, если мы делаем монадический edsl, кторый генерирует нам наше AST ?

Leonid
07.02.2018
15:26:51
Можно было бы. Но не было бы монадического языка. Был бы просто язык.
что мне мешает для моего АСТ написать инстанс монады?

Александр
07.02.2018
15:26:53
И еще есть полезность в типизации. Freer-сценарии позволяют больше делать с типами входных и выходных значений методов.

Dmitry
07.02.2018
15:26:54
и монадический интерпретатор?

ну хорошо, например вот

https://habrahabr.ru/post/134432/

и вот

Александр
07.02.2018
15:27:08
что мне мешает для моего АСТ написать инстанс монады?
Что он, в общем случае, не будет монадой

Dmitry
07.02.2018
15:27:18
https://github.com/voidlizard/emufat

kana
07.02.2018
15:27:42
что мне мешает для моего АСТ написать инстанс монады?
и получить то же, что и во фри, только не бесплатно

Александр
07.02.2018
15:27:48
Leonid
07.02.2018
15:27:52
Что он, в общем случае, не будет монадой
Если мне нужен общий случай то мне и на фри монадах не выразить будет

Dmitry
07.02.2018
15:28:09
монадический edsl для описания файловой системы, и интерпретатор, который генерирует байткод который эту файловую систему генерирует и интерпретатор байткода

я так понимаю - это именно наш случай, так?

Александр
07.02.2018
15:28:34
и монадический интерпретатор?
Да, есть еще abstract interpreter pattern для free-монадического языка

Leonid
07.02.2018
15:28:38
и получить то же, что и во фри, только не бесплатно
Ну так да. Я к тому что фри не такое и фри, там вокруг плясок будет больше чем то что тебе тут фри даст

kana
07.02.2018
15:29:06
например? Вроде кроме интерпретатора ничего писать руками не нужно

Dmitry
07.02.2018
15:29:07
можно было бы сделать как-то более лучше при помощи free monads ?

Александр
07.02.2018
15:29:12
Если мне нужен общий случай то мне и на фри монадах не выразить будет
Что за общий случай? На фри монадах можно выразить все, что можно выразить для предметной области.

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