Alexander
Из практики.
Dmitry
ну, например, ты сначала пишешь модель, модель моделирует, потом из модели генерируется что-то - например verilog
Dmitry
или сишный код
Dmitry
теоретически
Dmitry
практически.
Влод
но тут был чел который закинул ссылку на свои эффекты. и я у него спрсоил мол это для тестов/продакшенов и он такой неееее, не только
Dmitry
ты пишешь сложную программу на некоем урезанном убогом языке необщего назначения
Dmitry
из которого теоретически генерируется си, и промело/спин, что бы этот си верифицировать
Dmitry
с одной стороны, у тебя есть хаскельные типы, но эти типы относятся к хаскелу, а не к твоей программе и генерируют дичайшие ошибки во время компиляции
Dmitry
которые с трудом мапятся на эту программу
Зигохистоморфный
free отвечает за dsl cofree за интерпретатор
Dmitry
ну это вообще судьба всех edsl
Alexander
Вот есть два реальных сервиса по изготовлению и треканию сетов-фактур (invoices): Infakt Zoho Я сделал freer-языки, абстрагирующие эти сервисы. https://gist.github.com/graninas/1dbe50fb7000f06cc1936768ff501cea
Зигохистоморфный
free отвечает за dsl cofree за интерпретатор
http://dlaing.org/cofun/posts/free_and_cofree.html
Dmitry
можно примеры использования этих типов?
Зигохистоморфный
пора выкладывать свои подборки по free/freer (там много статей и материала)
Alexander
makeFreer?
Да, это реализация от "Takt, Inc": https://github.com/TaktInc/freer
Dmitry
пора конечно
Dmitry
если есть, что выкладывать
Зигохистоморфный
будет такой же лист как по рекурсивным схемам https://github.com/xgrommx/awesome-functional-programming/blob/master/rsfa.md
Alexander
можно примеры использования этих типов?
https://gist.github.com/graninas/5bd1e48b8b0b59e646e3d6f0c5ead745
Зигохистоморфный
можно примеры использования этих типов?
у меня только когда я моделировал Free через Fix (по хорошему надо через Mu, это в будущем) есть пример для бреинфака)) https://gist.github.com/xgrommx/a92ef9d74e912c69128855589791c3e7
Alexander
Зачем оно мою фотку сюда колбасиииит
Alexander
можно примеры использования этих типов?
(Обновил гист, закопипастил несколько строчек из интерпретатора, но это уже очевидные вещи)
кана
кучу Member можно на Members заменить
Dmitry
окей, вижу брейнфак
Зигохистоморфный
Dmitry
теперь пытаюсь понять профит по сравнению с тем, как если бы мы сделали тоже самое без фри монад вообще.
кана
или лучше на '[]
ну так Members '[] и использует
Alexander
или лучше на '[]
У нас еще не устоялись гайды. Но в данном случае на точный список лучше не менять. Точный список типов в другом месте у нас
Alexander
* не использовать
кана
type family Members ts r :: Constraint where Members '[] _ = () Members (t ': ts) r = (Member t r, Members ts r)
кана
речь не про точный список
Alexander
А, тогда ясно
Alexander
Да, можно было бы
Leonid 🦇
теперь пытаюсь понять профит по сравнению с тем, как если бы мы сделали тоже самое без фри монад вообще.
optparse-applicative и digestive-functors на фри. но и тот и другой можно запилить через композицию аппликативов
Dmitry
я правильно понимаю, что тоже самое можно было бы сделать просто определив тип (AST)
Зигохистоморфный
@voidlizard мне почему-то казалось что Гонзалес все уже сказал что надо знать http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html
Dmitry
и интерпретатор для значений этого типа
Dmitry
который делает то, что нам надо
Зигохистоморфный
я правильно понимаю, что тоже самое можно было бы сделать просто определив тип (AST)
ну можно было AST + рекурсивные схемы, алгебры, но это уже больше чем просто dsl
Leonid 🦇
только писать меньше
Dmitry
ну т.е
Alexander
и интерпретатор для значений этого типа
Можно было бы. Но не было бы монадического языка. Был бы просто язык.
Dmitry
монадическим он становится, если мы делаем монадический edsl, кторый генерирует нам наше AST ?
Leonid 🦇
Можно было бы. Но не было бы монадического языка. Был бы просто язык.
что мне мешает для моего АСТ написать инстанс монады?
Alexander
И еще есть полезность в типизации. Freer-сценарии позволяют больше делать с типами входных и выходных значений методов.
Dmitry
и монадический интерпретатор?
Dmitry
ну хорошо, например вот
Dmitry
https://habrahabr.ru/post/134432/
Dmitry
и вот
Alexander
что мне мешает для моего АСТ написать инстанс монады?
Что он, в общем случае, не будет монадой
Dmitry
https://github.com/voidlizard/emufat
кана
что мне мешает для моего АСТ написать инстанс монады?
и получить то же, что и во фри, только не бесплатно
Leonid 🦇
Что он, в общем случае, не будет монадой
Если мне нужен общий случай то мне и на фри монадах не выразить будет
Dmitry
монадический edsl для описания файловой системы, и интерпретатор, который генерирует байткод который эту файловую систему генерирует и интерпретатор байткода
Dmitry
я так понимаю - это именно наш случай, так?
Alexander
и монадический интерпретатор?
Да, есть еще abstract interpreter pattern для free-монадического языка
Leonid 🦇
и получить то же, что и во фри, только не бесплатно
Ну так да. Я к тому что фри не такое и фри, там вокруг плясок будет больше чем то что тебе тут фри даст
кана
например? Вроде кроме интерпретатора ничего писать руками не нужно
Dmitry
можно было бы сделать как-то более лучше при помощи free monads ?
Alexander
Если мне нужен общий случай то мне и на фри монадах не выразить будет
Что за общий случай? На фри монадах можно выразить все, что можно выразить для предметной области.
Leonid 🦇
например? Вроде кроме интерпретатора ничего писать руками не нужно
Ну так интерпретатор и будет у меня размером с мамашу
Leonid 🦇
как с вами тяжело
Dmitry
я правда пытаюсь понять
Dmitry
ну вот у меня было типично - ADT для AST
Alexander
можно было бы сделать как-то более лучше при помощи free monads ?
Можно сделать так, чтобы некоторые методы зависели от других. Чтобы нельзя было вызвать метод, если не вызван какой-то другой.
Dmitry
монадический билдер
Dmitry
монадический или какой угодно интерпретатор
Leonid 🦇
https://markkarpov.com/post/free-monad-considered-harmful.html
Зигохистоморфный
есть еще более высокие штуки типа recursion-schemes compdata compstrat и много еще чего
Dmitry
👆что достигается при помощи более лучшей типизацией на GADTs, смотри, например, hoopl
Alexander
А в моем монадическом eDSL для HTTP запросов еще и энфорсится type safety на уровне сценария. То есть, на уровне интерпретатора там всякие касты из/в JSON, но в сценарии этого не видно, вы типобезопасно работаете с вызовами
Dmitry
но это уже начинает нам стоить