Dmitry
теряем в простоте.
Denis
Leonid 🦇
господи, ну что нельзя сделать на мтл что можно на фри?
Dmitry
Александр можно не только декларацию языка, но и пример, как он используется в разных контекстах?
Alexander
Leonid 🦇
я могу вашу фри из мтл генерить
Dmitry
желательно с пояснениями - например, "вот тут мы просто тестируем сам протокол и возвращаем моки данных, а вот тут - уже вызываем реальные HTTP методы"
Alexander
Leonid 🦇
instance MonadTerm TerminalM where
getLine = Free (GetLine return)
printLine str = liftF (PrintLine str ())
Dmitry
так, это для функций
Dmitry
теперь - как мы добавляем сюда - ну, например, ветвление?
Leonid 🦇
Да чем там он захламляет то?
Dmitry
if то then getLIne else printLine
Leonid 🦇
Dmitry
так.
Зигохистоморфный
Leonid 🦇
ну т.е. пока не интепретируешь ты не узнаешь что у тебя в ветках
Alexander
Dmitry
hoopl это просто пример применения AST с использованием GADTs и типизацией результатов
Dmitry
ну т.е втрой серьезный пример после игрушечных на haskell wiki
Dmitry
хорошо, тип сами придумайте
Dmitry
мне важно ветвление
Зигохистоморфный
Denis
чего-то я с ветвлением проблемы не вижу
Alexander
мне важно ветвление
myFunc = do
line <- getLine
if line == "abc"
then getLine
else putLine line >> pure "xyz"
Dmitry
"инспектировать" = "получить в виде, доступном для преобразования"
Dmitry
например?
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
Зигохистоморфный
Alexander
Это не проблема edsl, это построение интерпретируемых экспрешшнов
Dmitry
нет, это проблема edsl
Leonid 🦇
в общем я в продакшен такое не потащу.
Dmitry
которая заключается в том, хочется писать на языке с типами, паттерн-матчингом и проч., а не на урезанной пародии на него
Dmitry
а если хочется писать на пародии, то можно очень-очень быстро написать внеший dsl который будет полнее, синтаксически проще и его можно будет отдавать внешним людям
Dmitry
а не заставлять аналитиков или еще кого писать внутри хаскельных файлов
Leonid 🦇
Alexander
нет, это проблема edsl
Если у вас задача - строить по данному сценарию сценарий на другом языке, то в вашей предметной области автоматически появлются деревья выражений (expressions), и их надо вносить в dsl
Dmitry
я все еще пытаюсь понять место фримонад во всей этой истории. т.е правда ли то, что я получаю
Alexander
Dmitry
хорошо, попробую еще раз
Alexander
Dmitry
первое. фримонады дают нам: возможность писать на некоем edsl, частично меняя способ его интерпретации в зависимости от контекста
Dmitry
правда/не правда?
Alexander
Я, кстати, в своем showcase такое тоже делал (внешний DSL генерил из фримонадного eDSL и наоборот), но ветка разработки немного заброшена. На гите в проекте все же можно увидеть куски от этого.
Denis
скорее что единственный способ работы с ними это написать интерпретатор
Alexander
Alexander
Dmitry
это даёт нам бесплатный монадический построитель для AST этого языка (?) или отсутствие необходимости в таком построителе
Alexander
Поправка: не AST все же, а только сценарии. Но если фримонадический eDSL описывает элементы AST, ваше утверждение становится истинным
кана
free строит не совсем ast
Denis
Получаешь монаду, которая строит структуру, при условии что дашь ей функтор.
Leonid 🦇
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
например, здесь
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
т.е вот тут могла бы быть фримонада, да?
Dmitry
ну, смотря проще, чем что?
Denis
Могла бы