
Leonid
07.02.2018
15:29:43

Александр
07.02.2018
15:30:01

Leonid
07.02.2018
15:30:10
как с вами тяжело

Dmitry
07.02.2018
15:30:34
я правда пытаюсь понять

Google

Dmitry
07.02.2018
15:30:53
ну вот у меня было типично - ADT для AST

Александр
07.02.2018
15:30:56

Dmitry
07.02.2018
15:30:58
монадический билдер
монадический или какой угодно интерпретатор

Leonid
07.02.2018
15:31:40
https://markkarpov.com/post/free-monad-considered-harmful.html

Denis
07.02.2018
15:31:45
есть еще более высокие штуки типа
recursion-schemes
compdata
compstrat
и много еще чего

Dmitry
07.02.2018
15:32:02
?что достигается при помощи более лучшей типизацией на GADTs, смотри, например, hoopl

Александр
07.02.2018
15:32:02
А в моем монадическом eDSL для HTTP запросов еще и энфорсится type safety на уровне сценария. То есть, на уровне интерпретатора там всякие касты из/в JSON, но в сценарии этого не видно, вы типобезопасно работаете с вызовами

Dmitry
07.02.2018
15:32:10
но это уже начинает нам стоить
теряем в простоте.

Александр
07.02.2018
15:32:34

Denis
07.02.2018
15:32:37

Leonid
07.02.2018
15:32:53
господи, ну что нельзя сделать на мтл что можно на фри?

Google

Dmitry
07.02.2018
15:32:54
Александр можно не только декларацию языка, но и пример, как он используется в разных контекстах?

Александр
07.02.2018
15:32:59

Leonid
07.02.2018
15:33:09
я могу вашу фри из мтл генерить

Dmitry
07.02.2018
15:33:35
желательно с пояснениями - например, "вот тут мы просто тестируем сам протокол и возвращаем моки данных, а вот тут - уже вызываем реальные HTTP методы"

Александр
07.02.2018
15:33:41

Leonid
07.02.2018
15:33:43
instance MonadTerm TerminalM where
getLine = Free (GetLine return)
printLine str = liftF (PrintLine str ())

Dmitry
07.02.2018
15:34:09
так, это для функций
теперь - как мы добавляем сюда - ну, например, ветвление?

Александр
07.02.2018
15:34:32

Leonid
07.02.2018
15:34:47
Да чем там он захламляет то?

Dmitry
07.02.2018
15:34:48
if то then getLIne else printLine

Leonid
07.02.2018
15:35:21

Dmitry
07.02.2018
15:35:29
так.

Denis
07.02.2018
15:35:41

Leonid
07.02.2018
15:35:49
ну т.е. пока не интепретируешь ты не узнаешь что у тебя в ветках

Александр
07.02.2018
15:35:53

Dmitry
07.02.2018
15:36:13
hoopl это просто пример применения AST с использованием GADTs и типизацией результатов
ну т.е втрой серьезный пример после игрушечных на haskell wiki

Александр
07.02.2018
15:36:31

Dmitry
07.02.2018
15:36:42
хорошо, тип сами придумайте

Google

Dmitry
07.02.2018
15:36:44
мне важно ветвление

Denis
07.02.2018
15:37:02

Denis
07.02.2018
15:37:44
чего-то я с ветвлением проблемы не вижу

Александр
07.02.2018
15:38:12
мне важно ветвление
myFunc = do
line <- getLine
if line == "abc"
then getLine
else putLine line >> pure "xyz"

Leonid
07.02.2018
15:38:32

Dmitry
07.02.2018
15:38:54
"инспектировать" = "получить в виде, доступном для преобразования"
например?

Александр
07.02.2018
15:38:59

Denis
07.02.2018
15:39:08

Dmitry
07.02.2018
15:39:08
ну, если мы получаем некую AST, её, например, хорошо уметь преобразовывать

Denis
07.02.2018
15:39:10
и его целиком писать

Александр
07.02.2018
15:39:28
data MyLang a where
If :: Bool -> MyLang a -> MyLang a -> MyLang a

Leonid
07.02.2018
15:39:28
например?
Ну короч нужен будет конструктор IfThenElse (TerminalM Bool) (TerminalM a) (TerminalM a)

Dmitry
07.02.2018
15:39:33
ага
ну т.е всё та же самая проблема edsl

Denis
07.02.2018
15:40:01

Александр
07.02.2018
15:40:06
Это не проблема edsl, это построение интерпретируемых экспрешшнов

Dmitry
07.02.2018
15:40:22
нет, это проблема edsl

Leonid
07.02.2018
15:40:26
в общем я в продакшен такое не потащу.

Dmitry
07.02.2018
15:40:48
которая заключается в том, хочется писать на языке с типами, паттерн-матчингом и проч., а не на урезанной пародии на него

Google

Dmitry
07.02.2018
15:41:17
а если хочется писать на пародии, то можно очень-очень быстро написать внеший dsl который будет полнее, синтаксически проще и его можно будет отдавать внешним людям
а не заставлять аналитиков или еще кого писать внутри хаскельных файлов

Leonid
07.02.2018
15:41:34

Александр
07.02.2018
15:41:39
нет, это проблема edsl
Если у вас задача - строить по данному сценарию сценарий на другом языке, то в вашей предметной области автоматически появлются деревья выражений (expressions), и их надо вносить в dsl

Dmitry
07.02.2018
15:42:12
я все еще пытаюсь понять место фримонад во всей этой истории. т.е правда ли то, что я получаю

Александр
07.02.2018
15:42:29

Dmitry
07.02.2018
15:42:45
хорошо, попробую еще раз

Александр
07.02.2018
15:42:47

Dmitry
07.02.2018
15:43:33
первое. фримонады дают нам: возможность писать на некоем edsl, частично меняя способ его интерпретации в зависимости от контекста
правда/не правда?

Александр
07.02.2018
15:44:17
Я, кстати, в своем showcase такое тоже делал (внешний DSL генерил из фримонадного eDSL и наоборот), но ветка разработки немного заброшена. На гите в проекте все же можно увидеть куски от этого.

Denis
07.02.2018
15:44:26
скорее что единственный способ работы с ними это написать интерпретатор

Александр
07.02.2018
15:44:27

Dmitry
07.02.2018
15:45:04
это даёт нам бесплатный монадический построитель для AST этого языка (?) или отсутствие необходимости в таком построителе

Александр
07.02.2018
15:46:05
Поправка: не AST все же, а только сценарии. Но если фримонадический eDSL описывает элементы AST, ваше утверждение становится истинным

kana
07.02.2018
15:46:16
free строит не совсем ast

Denis
07.02.2018
15:46:31
Получаешь монаду, которая строит структуру, при условии что дашь ей функтор.

Leonid
07.02.2018
15:46:35

Dmitry
07.02.2018
15:46:58
для типа, который представляет AST ну или не AST, но что-то, что должно в итоге интерпретироваться?

Google

kana
07.02.2018
15:47:31
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
07.02.2018
15:47:46
(для меня, кстати, вообще не было очевидно, что он должен быть Monad, но да ладно)

Александр
07.02.2018
15:48:00
Как код вставляете?

Dmitry
07.02.2018
15:48:04
@catamorphism ага!
т.е то, что я обычно делал при помощи Writer
например, здесь

Andrei
07.02.2018
15:49:14

Dmitry
07.02.2018
15:49:26
https://github.com/voidlizard/emufat/blob/master/src/TestVM.hs
т.е мы, с одной стороны, не должны делать это вручную / нецелевым образом использовать Writer
с другой стороны, не получаем полноценный first-class AST, который можно преобразовывать
https://github.com/voidlizard/emufat/blob/e1cdbebfd7c26f1362cd59273d856d5e13db36b5/src/TestVM.hs#L114
т.е вот тут могла бы быть фримонада, да?

Александр
07.02.2018
15:51:17

Dmitry
07.02.2018
15:51:32
ну, смотря проще, чем что?

Denis
07.02.2018
15:51:36
Могла бы

Александр
07.02.2018
15:51:50

Dmitry
07.02.2018
15:51:55
свой игрушечный язык написать проще, чем в ghc лезть
даже с HM-типизацией и выводом типов

Denis
07.02.2018
15:52:07
Writer тоже, кстати, considered harmful

Dmitry
07.02.2018
15:52:19
да это понятно, что всё консайдеред
возможно, когда такое слышишь, надо уже задаться вопросом - а кому хармфул?

Александр
07.02.2018
15:52:39