Alexander
То есть да
Alexander
Только профит в другом :)
Dmitry
ну да, в якобы возможности менять способ интерпретации, не меняя, допустим, весь интерпретатор
Dmitry
допустим, нам нужна не пауза, а пауза с логом
Dmitry
я понял.
кана
это как когда мы хотим сделать 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 собствено это тоже почти список
Alexander
Dmitry
для генерации не очень, для оптимизации не очень, для скорости выполнения не очень
кана
для абстракции зато норм
кана
второй день обсуждения фри
Dmitry
ну, кто-то переживал, что тут мало хаскеля?
Dmitry
это про хаскель
Dmitry
теперь вот для этого data InstF a = One a | Many Int a | Pause a deriving (Functor, Foldable, Traversable, Eq, Show)
Dmitry
мы хотим добавить
Dmitry
Branch a a a
Dmitry
у нас получается?
Alexander
Да
Alexander
Нужно расширить ADT и интерпретатор
Зигохистоморфный
мне кажется надо просто пейпер автора прочитать, там и про фри и фриер http://okmij.org/ftp/Haskell/extensible/more.pdf
кана
да, но зачем? Ну то есть фри не берут чтобы представлять аст кода, лишь список команд, который нужно выполнить по порядку
Alexander
Только будет Branch (Free InstF a) (Free InstF a) a
Dmitry
ну что за список команд без ветвления?
Dmitry
а, это ж олег
кана
вот наш список
кана
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
черт, достаточно было бы имени
Dmitry
и можно сворачивать все обсуждения
Зигохистоморфный
кана
У нас список команд [GetValue, DoSmth1 "hello"] или просто [GetValue], второй элемент (его наличие даже) зависит от результата ИНТЕРПРЕТАЦИИ первого
Dmitry
окей, и?
кана
в списке команд нам не нужно ветвление, нам нужно только выполнить каждую команду последовательно, причем следующую команду для выполнения мы получаем из выполнения текущией, если это зависит (то самое ветвление)
Dmitry
https://markkarpov.com/post/free-monad-considered-harmful.html
Dmitry
ну и? 👆 он неправ?
Dmitry
(заруба K.I.S.S vs. SOLID )
Alexander
Зависит от требований к вашей предметной области
Alexander
Всегда так: может, вам годится конкретное решение, а может и нет. Нам - годится, мы уже получаем профиты
Andrey
@voidlizard что именно, парсер регулярок? Есть набор правил: если строка попадает под эту регулярок, то делай так, если по эту, то этак. Мне надо понять, есть ли в нем конфликты.
Alexander
(заруба K.I.S.S vs. SOLID )
Давайте завтра про крайне статическую vs крайне динамическую типизацию поговорим, например. Тут есть тоже предмет для спора.
Dmitry
Александр про профиты можно? пока я слышал про: 1) не надо писать монадические конструкторы 2) можно частично менять интерпратацию (добавлять логинг)
Dmitry
про (1) понятно
Dmitry
хотя и так себе
Dmitry
про (2)
Dmitry
интересно что реально надо менять и как часто и какие реальные кейсы
Dmitry
ну и да, давайте про динамическую
Dmitry
сделать из хаскеля интерпретируемый язык мы уже умеем, писать не нём нетипизированно могу научить
Dmitry
это сложно. но можно.
Зигохистоморфный
Data.Dynamic?
Dmitry
легко выводить, когда все типы - String
Dmitry
ну или Value
Dmitry
@voidlizard что именно, парсер регулярок? Есть набор правил: если строка попадает под эту регулярок, то делай так, если по эту, то этак. Мне надо понять, есть ли в нем конфликты.
Dmitry
👆короч, разобрать регулярку, построить модель, проанализировать на противоречие?
Dmitry
и тебе интересно, не делал ли кто парсер регулярок?
Dmitry
(вырвать парсер из какого-нибудь пакета с регулярками?)
Andrey
Парсер я уже сам сделал, оказалось несложно.
Alexander
Александр про профиты можно? пока я слышал про: 1) не надо писать монадические конструкторы 2) можно частично менять интерпратацию (добавлять логинг)
Ну у нас сейчас четко отделены сами языки предметной области, на которых мы пишем, как наш ресторанный сервис должен работать, от имплементации, где находятся всякие BD, HTTP, конкретные либы (для времени, для дат, для всякого такого), а также настройки конкретных внешних сервисов (invoicing services, сервисов заказа еды и проч). Из наших сценариев не видно никаких лишних деталей. Например, там не светятся API keys, не светится модель данных для БД. Мы просто оперируем нашими ADT. И еще мы можем любую чать имплементации оторвать и протестировать без нее. Не будешь же дергать реальный invoicing service в тестах. Но прелесть в том, что наши сценарии чистые, предсказуемые, и там кроме предметной области ничего нет лишнего.
Andrey
Хз что с ними дальше делать.
Dmitry
@rblaze но надо знать, что есть противоречие. два правила матчат одну строку?
Andrey
Ага.
Denis
а я такую фигню на питоне писал лет семь назад
Dmitry
найти инпут, который будет сматчен обоими правилами. нет ли здесь проблемы останова? не является ли ответом перебор - т.е преобразовать инпут к генерируемому виду и не натравить на него arbitrary / quickcheck ?
Dmitry
@catamorphism путаешься в показаниях!
Denis
проблемы останова нет
Denis
точнее может и есть с каким-нибудь pcre
Dmitry
руби vs змей
Dmitry
неважно
Denis
я оба успел
Dmitry
а как сделать - для каждого элемента регекспа генерить минимальный инпут, который он разбирает
Dmitry
минимальный - на минимальном алфавите
Denis
чего-то я уже хреново помню как делал
Dmitry
а потом искать common prefix ?
Denis
по-моему конечные автоматы строил
Dmitry
ну короч, проблема кажется скорее cs, чем относящаяся к конкретному инструменту
Alexander
это сложно. но можно.
Ну, ToJSon/FromJson и вперед 😄