
Dmitry
09.02.2018
15:00:00
и фримонада к этому всему относится примерно никак.

kana
09.02.2018
15:00:10

? animufag ?
09.02.2018
15:00:16
а засчёт чего фри/фрир медленные?

Alexander
09.02.2018
15:01:21
засчет, того, что их выполнение это интепретация структуры (которая ещё и не факт, что сфьюзится) в итоге на каждую операцию делаем лишнее. Это даже в случае если у нас condencity есть и сложность не растет с длиной программы

Google

Alexander
09.02.2018
15:01:32
(наверняка слова я не все верно употребил

Denis
09.02.2018
15:02:34
во https://qfpl.io/posts/optimising-free-with-plated/

Dmitry
09.02.2018
15:03:01
(вспоминает, как в 2001-ом году писал парсер rtf, и в книже Гаммы предлагалось его обрабатывать паттерном Command, и такой обработчик был написан, потом выяснилось, что какой Command не помогает, нужен полноценный контекстно-зависимый парсер, а Гамма или кто там - никогда никакого парсера не писал, зато писал книжку про паттерны)

Александр
09.02.2018
15:03:36

Andrei
09.02.2018
15:03:40

Dmitry
09.02.2018
15:06:25
допустим, мы написали на Free парсер-генератор. 1) dsl 2) вроде подходит по семантике-примерам
3) допустим, нам полезно иногда вставить в разбор логи
4) все равно мы выбрасываем всё это, потому что парсер-генератор должен генерировать быстрые парсеры.
end of case.

Александр
09.02.2018
15:07:48
Не очень ясно, как скорость парсер-генератора связана со скоростью генерируемых парсеров

Dmitry
09.02.2018
15:08:23
ну, так free ж не генерирует этот парсер, код на free этот самый парсер и есть

Александр
09.02.2018
15:08:51
Ну забейте тогда.

Google

Александр
09.02.2018
15:09:13
Все-таки, это больше для кейсов, когда много бизнес-логики.

Dmitry
09.02.2018
15:09:42
да я особо не вижу, чем бизнес-логика отличается от просто логики

kana
09.02.2018
15:10:23
еще раз уточню на всякий случай
фри не для генерации кода (и его видоизменения, хоть можно), он для интерпретации кода отдельно (а во время интерпретации нам не нужно знать, что где-то там if, нам важна только следующая команда)

Dmitry
09.02.2018
15:11:47
data InstF a
= One a
| Many Int a
| Pause a
deriving (Functor, Foldable, Traversable, Eq, Show)
type Inst = Free InstF
one :: Inst ()
one = liftF $ One ()
many :: Int -> Inst ()
many n = liftF $ Many n ()
pause :: Inst ()
pause = liftF $ Pause ()
из статьи
я правильно понимаю, что здесь забыт
makeFree ''
который и создаёт весь профит? т.е конструкторы написаны руками

kana
09.02.2018
15:12:16
да, все три функции можно сгенерить через makeFree ''InstF

Александр
09.02.2018
15:12:36
То есть да
Только профит в другом :)

Dmitry
09.02.2018
15:13:41
ну да, в якобы возможности менять способ интерпретации, не меняя, допустим, весь интерпретатор
допустим, нам нужна не пауза, а пауза с логом
я понял.

kana
09.02.2018
15:14:02
это как когда мы хотим сделать 3 операции над списком, мы сначала создаем список
x = Cons 1 (Cons 2 Nil)
с тремя дырами (Cons, Cons, Nil)
а потом в foldr заменяем все Cons на функцию, а Nil на значение тремя разными способами (пара (a -> b -> b, b) - это и есть интерпретатор списка)
a = f 1 (f 2 z1)
b = g 1 (g 2 z2)
Free собствено это тоже почти список

Александр
09.02.2018
15:14:14

Denis
09.02.2018
15:14:37

Dmitry
09.02.2018
15:14:43
для генерации не очень, для оптимизации не очень, для скорости выполнения не очень

kana
09.02.2018
15:15:00
для абстракции зато норм
второй день обсуждения фри

Google

Dmitry
09.02.2018
15:15:39
ну, кто-то переживал, что тут мало хаскеля?
это про хаскель
теперь вот для этого
data InstF a
= One a
| Many Int a
| Pause a
deriving (Functor, Foldable, Traversable, Eq, Show)
мы хотим добавить
Branch a a a
у нас получается?

Александр
09.02.2018
15:16:52
Да
Нужно расширить ADT и интерпретатор

Denis
09.02.2018
15:17:41
мне кажется надо просто пейпер автора прочитать, там и про фри и фриер http://okmij.org/ftp/Haskell/extensible/more.pdf

kana
09.02.2018
15:17:43
да, но зачем? Ну то есть фри не берут чтобы представлять аст кода, лишь список команд, который нужно выполнить по порядку

Александр
09.02.2018
15:17:49
Только будет
Branch (Free InstF a) (Free InstF a) a

Dmitry
09.02.2018
15:17:56
ну что за список команд без ветвления?

kana
09.02.2018
15:18:08

Dmitry
09.02.2018
15:18:28
а, это ж олег

kana
09.02.2018
15:18:29
вот наш список
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
09.02.2018
15:18:39
черт, достаточно было бы имени
и можно сворачивать все обсуждения

Denis
09.02.2018
15:18:58

kana
09.02.2018
15:19:12
У нас список команд [GetValue, DoSmth1 "hello"] или просто [GetValue], второй элемент (его наличие даже) зависит от результата ИНТЕРПРЕТАЦИИ первого

Google

Dmitry
09.02.2018
15:20:10
окей, и?

kana
09.02.2018
15:20:22
в списке команд нам не нужно ветвление, нам нужно только выполнить каждую команду последовательно, причем следующую команду для выполнения мы получаем из выполнения текущией, если это зависит (то самое ветвление)

Dmitry
09.02.2018
15:25:00
https://markkarpov.com/post/free-monad-considered-harmful.html
ну и? ? он неправ?
(заруба K.I.S.S vs. SOLID )

Александр
09.02.2018
15:25:40
Зависит от требований к вашей предметной области
Всегда так: может, вам годится конкретное решение, а может и нет. Нам - годится, мы уже получаем профиты

Andrey
09.02.2018
15:26:43
@voidlizard что именно, парсер регулярок? Есть набор правил: если строка попадает под эту регулярок, то делай так, если по эту, то этак. Мне надо понять, есть ли в нем конфликты.

Александр
09.02.2018
15:27:30
(заруба K.I.S.S vs. SOLID )
Давайте завтра про крайне статическую vs крайне динамическую типизацию поговорим, например. Тут есть тоже предмет для спора.

Dmitry
09.02.2018
15:27:32
Александр про профиты можно? пока я слышал про: 1) не надо писать монадические конструкторы 2) можно частично менять интерпратацию (добавлять логинг)
про (1) понятно
хотя и так себе
про (2)
интересно что реально надо менять и как часто и какие реальные кейсы
ну и да, давайте про динамическую
сделать из хаскеля интерпретируемый язык мы уже умеем, писать не нём нетипизированно могу научить
это сложно. но можно.

Denis
09.02.2018
15:29:26

ParkeT
09.02.2018
15:29:26

Google

Denis
09.02.2018
15:29:34
Data.Dynamic?

Dmitry
09.02.2018
15:29:36
легко выводить, когда все типы - String
ну или Value
@voidlizard что именно, парсер регулярок? Есть набор правил: если строка попадает под эту регулярок, то делай так, если по эту, то этак. Мне надо понять, есть ли в нем конфликты.
?короч, разобрать регулярку, построить модель, проанализировать на противоречие?
и тебе интересно, не делал ли кто парсер регулярок?
(вырвать парсер из какого-нибудь пакета с регулярками?)

Andrey
09.02.2018
15:31:47
Парсер я уже сам сделал, оказалось несложно.

Александр
09.02.2018
15:32:10
Александр про профиты можно? пока я слышал про: 1) не надо писать монадические конструкторы 2) можно частично менять интерпратацию (добавлять логинг)
Ну у нас сейчас четко отделены сами языки предметной области, на которых мы пишем, как наш ресторанный сервис должен работать, от имплементации, где находятся всякие BD, HTTP, конкретные либы (для времени, для дат, для всякого такого), а также настройки конкретных внешних сервисов (invoicing services, сервисов заказа еды и проч). Из наших сценариев не видно никаких лишних деталей. Например, там не светятся API keys, не светится модель данных для БД. Мы просто оперируем нашими ADT. И еще мы можем любую чать имплементации оторвать и протестировать без нее. Не будешь же дергать реальный invoicing service в тестах. Но прелесть в том, что наши сценарии чистые, предсказуемые, и там кроме предметной области ничего нет лишнего.

Andrey
09.02.2018
15:32:13
Хз что с ними дальше делать.

Dmitry
09.02.2018
15:32:58
@rblaze но надо знать, что есть противоречие. два правила матчат одну строку?

Andrey
09.02.2018
15:33:30
Ага.

Denis
09.02.2018
15:33:39
а я такую фигню на питоне писал лет семь назад

Dmitry
09.02.2018
15:34:11
найти инпут, который будет сматчен обоими правилами. нет ли здесь проблемы останова? не является ли ответом перебор - т.е преобразовать инпут к генерируемому виду и не натравить на него arbitrary / quickcheck ?
@catamorphism путаешься в показаниях!

Denis
09.02.2018
15:34:38
проблемы останова нет
точнее может и есть с каким-нибудь pcre

Dmitry
09.02.2018
15:35:12
руби vs змей
неважно

Denis
09.02.2018
15:35:32
я оба успел

Dmitry
09.02.2018
15:35:35
а как сделать - для каждого элемента регекспа генерить минимальный инпут, который он разбирает