@haskellru

Страница 817 из 1551
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
можно было бы сделать как-то более лучше при помощи free monads ?
Можно сделать так, чтобы некоторые методы зависели от других. Чтобы нельзя было вызвать метод, если не вызван какой-то другой.

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
https://markkarpov.com/post/free-monad-considered-harmful.html
Ошибка "предвзятость подтверждения". Можно найти любую точку зрения, подтверждающую вашу, если ее искать

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
?что достигается при помощи более лучшей типизацией на GADTs, смотри, например, hoopl
GADTs в общем случае как раз и хорошо использовать вместе с Free (см. мой гист)

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
господи, ну что нельзя сделать на мтл что можно на фри?
Концепции равно мощны. Но mtl более захламляет сценарии предметной области чисто языковыми конструкциями

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
if то then getLIne else printLine
фри не поможет

Dmitry
07.02.2018
15:35:29
так.

Denis
07.02.2018
15:35:41
?что достигается при помощи более лучшей типизацией на GADTs, смотри, например, hoopl
ну hoopl это уже про всякие оптимизации и редукции графов когда делаешь свой язык

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

Dmitry
07.02.2018
15:36:13
hoopl это просто пример применения AST с использованием GADTs и типизацией результатов

ну т.е втрой серьезный пример после игрушечных на haskell wiki

Александр
07.02.2018
15:36:31
if то then getLIne else printLine
Зачем две конструкции, возвращающие разный тип, запихивать в ветвление?

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
Ну короч нужен будет конструктор IfThenElse (TerminalM Bool) (TerminalM a) (TerminalM a)
ну или его базовый функтор) чтобы не строить явные рекурсии

Александр
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 который будет полнее, синтаксически проще и его можно будет отдавать внешним людям

а не заставлять аналитиков или еще кого писать внутри хаскельных файлов

Александр
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
Получаешь монаду, которая строит структуру, при условии что дашь ей функтор.

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
Как код вставляете?
github-flavored markdown

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
с другой стороны, не получаем полноценный first-class AST, который можно преобразовывать
Для такого проще, наверное, вообще GHC задействовать. Есть там средства для разбора и выполнения хаскельного кода.

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
Writer тоже, кстати, considered harmful
Considering harmful considered harmful

Страница 817 из 1551