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
Влод
Зигохистоморфный
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
Зигохистоморфный
можно примеры использования этих типов?
у меня только когда я моделировал Free через Fix (по хорошему надо через Mu, это в будущем) есть пример для бреинфака))
https://gist.github.com/xgrommx/a92ef9d74e912c69128855589791c3e7
Alexander
Зачем оно мою фотку сюда колбасиииит
кана
кучу Member можно на Members заменить
Dmitry
окей, вижу брейнфак
Зигохистоморфный
Dmitry
теперь пытаюсь понять профит по сравнению с тем, как если бы мы сделали тоже самое без фри монад вообще.
Alexander
или лучше на '[]
У нас еще не устоялись гайды. Но в данном случае на точный список лучше не менять. Точный список типов в другом месте у нас
Alexander
* не использовать
кана
type family Members ts r :: Constraint where
Members '[] _ = ()
Members (t ': ts) r = (Member t r, Members ts r)
кана
речь не про точный список
Alexander
А, тогда ясно
Alexander
Да, можно было бы
Dmitry
я правильно понимаю, что тоже самое можно было бы сделать просто определив тип (AST)
Зигохистоморфный
@voidlizard мне почему-то казалось что Гонзалес все уже сказал что надо знать http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html
Dmitry
и интерпретатор для значений этого типа
Dmitry
который делает то, что нам надо
Зигохистоморфный
Leonid 🦇
Leonid 🦇
только писать меньше
Dmitry
ну т.е
Dmitry
монадическим он становится, если мы делаем монадический edsl, кторый генерирует нам наше AST ?
Leonid 🦇
Alexander
И еще есть полезность в типизации. Freer-сценарии позволяют больше делать с типами входных и выходных значений методов.
Dmitry
и монадический интерпретатор?
Dmitry
ну хорошо, например вот
Dmitry
https://habrahabr.ru/post/134432/
Dmitry
и вот
Alexander
Dmitry
https://github.com/voidlizard/emufat
кана
Alexander
Dmitry
монадический edsl для описания файловой системы, и интерпретатор, который генерирует байткод который эту файловую систему генерирует и интерпретатор байткода
Dmitry
я так понимаю - это именно наш случай, так?
кана
например? Вроде кроме интерпретатора ничего писать руками не нужно
Dmitry
можно было бы сделать как-то более лучше при помощи free monads ?
Alexander
Leonid 🦇
Alexander
Leonid 🦇
как с вами тяжело
Dmitry
я правда пытаюсь понять
Dmitry
ну вот у меня было типично - ADT для AST
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
но это уже начинает нам стоить