Dmitry
теряем в простоте.
Alexander
https://markkarpov.com/post/free-monad-considered-harmful.html
Ошибка "предвзятость подтверждения". Можно найти любую точку зрения, подтверждающую вашу, если ее искать
Leonid 🦇
господи, ну что нельзя сделать на мтл что можно на фри?
Dmitry
Александр можно не только декларацию языка, но и пример, как он используется в разных контекстах?
Alexander
Ну так интерпретатор и будет у меня размером с мамашу
Можно разбить язык на отдельные части. См. мой гист
Leonid 🦇
я могу вашу фри из мтл генерить
Dmitry
желательно с пояснениями - например, "вот тут мы просто тестируем сам протокол и возвращаем моки данных, а вот тут - уже вызываем реальные HTTP методы"
Alexander
👆что достигается при помощи более лучшей типизацией на GADTs, смотри, например, hoopl
GADTs в общем случае как раз и хорошо использовать вместе с Free (см. мой гист)
Leonid 🦇
instance MonadTerm TerminalM where getLine = Free (GetLine return) printLine str = liftF (PrintLine str ())
Dmitry
так, это для функций
Dmitry
теперь - как мы добавляем сюда - ну, например, ветвление?
Alexander
господи, ну что нельзя сделать на мтл что можно на фри?
Концепции равно мощны. Но mtl более захламляет сценарии предметной области чисто языковыми конструкциями
Leonid 🦇
Да чем там он захламляет то?
Dmitry
if то then getLIne else printLine
Leonid 🦇
if то then getLIne else printLine
фри не поможет
Dmitry
так.
Зигохистоморфный
👆что достигается при помощи более лучшей типизацией на GADTs, смотри, например, hoopl
ну hoopl это уже про всякие оптимизации и редукции графов когда делаешь свой язык
Leonid 🦇
ну т.е. пока не интепретируешь ты не узнаешь что у тебя в ветках
Dmitry
hoopl это просто пример применения AST с использованием GADTs и типизацией результатов
Dmitry
ну т.е втрой серьезный пример после игрушечных на haskell wiki
Alexander
if то then getLIne else printLine
Зачем две конструкции, возвращающие разный тип, запихивать в ветвление?
Dmitry
хорошо, тип сами придумайте
Dmitry
мне важно ветвление
Зигохистоморфный
Denis
чего-то я с ветвлением проблемы не вижу
Alexander
мне важно ветвление
myFunc = do line <- getLine if line == "abc" then getLine else putLine line >> pure "xyz"
Leonid 🦇
мне важно ветвление
инспектировать ветки без интерпретации не получится
Dmitry
"инспектировать" = "получить в виде, доступном для преобразования"
Dmitry
например?
Alexander
инспектировать ветки без интерпретации не получится
Да, если хочется интерпретировать / инспектировать, то все языковые конструкции должны быть включены в сам язык
Denis
инспектировать ветки без интерпретации не получится
в данном случае один из “интерпретаторов” инспектором и будет
Dmitry
ну, если мы получаем некую AST, её, например, хорошо уметь преобразовывать
Denis
и его целиком писать
Alexander
data MyLang a where If :: Bool -> MyLang a -> MyLang a -> MyLang a
Leonid 🦇
например?
Ну короч нужен будет конструктор IfThenElse (TerminalM Bool) (TerminalM a) (TerminalM a)
Dmitry
ага
Dmitry
ну т.е всё та же самая проблема edsl
Зигохистоморфный
Ну короч нужен будет конструктор IfThenElse (TerminalM Bool) (TerminalM a) (TerminalM a)
ну или его базовый функтор) чтобы не строить явные рекурсии
Alexander
Это не проблема edsl, это построение интерпретируемых экспрешшнов
Dmitry
нет, это проблема edsl
Leonid 🦇
в общем я в продакшен такое не потащу.
Dmitry
которая заключается в том, хочется писать на языке с типами, паттерн-матчингом и проч., а не на урезанной пародии на него
Dmitry
а если хочется писать на пародии, то можно очень-очень быстро написать внеший dsl который будет полнее, синтаксически проще и его можно будет отдавать внешним людям
Dmitry
а не заставлять аналитиков или еще кого писать внутри хаскельных файлов
Alexander
нет, это проблема edsl
Если у вас задача - строить по данному сценарию сценарий на другом языке, то в вашей предметной области автоматически появлются деревья выражений (expressions), и их надо вносить в dsl
Dmitry
я все еще пытаюсь понять место фримонад во всей этой истории. т.е правда ли то, что я получаю
Dmitry
хорошо, попробую еще раз
Alexander
я все еще пытаюсь понять место фримонад во всей этой истории. т.е правда ли то, что я получаю
Они немного для другого, хотя и для этого их тоже можно задействовать.
Dmitry
первое. фримонады дают нам: возможность писать на некоем edsl, частично меняя способ его интерпретации в зависимости от контекста
Dmitry
правда/не правда?
Alexander
Я, кстати, в своем showcase такое тоже делал (внешний DSL генерил из фримонадного eDSL и наоборот), но ветка разработки немного заброшена. На гите в проекте все же можно увидеть куски от этого.
Denis
скорее что единственный способ работы с ними это написать интерпретатор
Alexander
Dmitry
это даёт нам бесплатный монадический построитель для AST этого языка (?) или отсутствие необходимости в таком построителе
Alexander
Поправка: не AST все же, а только сценарии. Но если фримонадический eDSL описывает элементы AST, ваше утверждение становится истинным
кана
free строит не совсем ast
Denis
Получаешь монаду, которая строит структуру, при условии что дашь ей функтор.
Dmitry
для типа, который представляет AST ну или не AST, но что-то, что должно в итоге интерпретироваться?
кана
data T n = GetValue (Int -> n) | DoSmth String n do value <- getValue if value === 0 then doSmth1 "hello" else pure () -- ==> Free (GetValue (\value -> if value === 0 then Free (DoSmth1 "hello" (Pure ())) else Pure ()) отсюда и ветвления
Dmitry
(для меня, кстати, вообще не было очевидно, что он должен быть Monad, но да ладно)
Alexander
Как код вставляете?
Dmitry
@catamorphism ага!
Dmitry
т.е то, что я обычно делал при помощи Writer
Dmitry
например, здесь
Andrei
Как код вставляете?
github-flavored markdown
Dmitry
https://github.com/voidlizard/emufat/blob/master/src/TestVM.hs
Dmitry
т.е мы, с одной стороны, не должны делать это вручную / нецелевым образом использовать Writer
Dmitry
с другой стороны, не получаем полноценный first-class AST, который можно преобразовывать
Dmitry
https://github.com/voidlizard/emufat/blob/e1cdbebfd7c26f1362cd59273d856d5e13db36b5/src/TestVM.hs#L114
Dmitry
т.е вот тут могла бы быть фримонада, да?
Alexander
с другой стороны, не получаем полноценный first-class AST, который можно преобразовывать
Для такого проще, наверное, вообще GHC задействовать. Есть там средства для разбора и выполнения хаскельного кода.
Dmitry
ну, смотря проще, чем что?
Denis
Могла бы
Alexander
т.е вот тут могла бы быть фримонада, да?
Могла бы быть, но профита будет не слишком много, я полагаю