Size: a a a

Compiler Development

2020 April 01

А

Алексей in Compiler Development
Михаил Бахтерев
Монады - это не про синтаксис, а про возвращаемые значения и методы их компоновки. Соблюдение монадных законов, даже тогда, когда, кажется, что не нужно, сильно упрощает жизнь. Весьма существенно.

Ну. Таков мой опыт. Я когда в тупик захожу с кодом в котором появляется куча if-ов, с бэктрэкингом мерзким или с прохрдами по предоставленным пользователем деревьям, меня выручают монады. do-нотация тут и не при чём даже. Дело в том, как корректно абстрагировать шаги вычисления, чтобы они потом компоновались
Вот тут как раз не обязательно компоновать шаги вычислений, потому что они и так естественным образом компонуются в императивных языках. Потому что компоновка тут весьма проста.
источник

K

Konstantin in Compiler Development
госпади, когда же эти холивары закончатся
источник

А

Алексей in Compiler Development
Konstantin
госпади, когда же эти холивары закончатся
никогда
источник

МБ

Михаил Бахтерев in Compiler Development
Peter Sovietov
Если хотите, могу в личном сообщении примеры кода показать. Они для будущей статьи :)
Был бы весьма благодарен. Не хочется накостылять велосипед с прямоугольными колёсами :) Ссылки на статью обещаю.
источник

K

Konstantin in Compiler Development
а может они закончатся тогда, когда процессоры начнут делать с учётом монадических законов, а не как императивные молотилки памяти? )))
источник

МБ

Михаил Бахтерев in Compiler Development
Алексей
Вот тут как раз не обязательно компоновать шаги вычислений, потому что они и так естественным образом компонуются в императивных языках. Потому что компоновка тут весьма проста.
Не компонуются. Всё равно, вот есть у вас два результата из двух функций, как логически корректно скомпонвать их в один результат? Просто ; поставить не выйдет.
источник

МБ

Михаил Бахтерев in Compiler Development
Konstantin
а может они закончатся тогда, когда процессоры начнут делать с учётом монадических законов, а не как императивные молотилки памяти? )))
Процессор - это комонадный интерпретатор монады ISA процессора :-)
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Не компонуются. Всё равно, вот есть у вас два результата из двух функций, как логически корректно скомпонвать их в один результат? Просто ; поставить не выйдет.
А монады тут как помогут?
источник

А

Алексей in Compiler Development
Единственное что приходит на ум, это какая-то автоматическая компоновка в кортежи.
источник

А

Алексей in Compiler Development
Но это на мой взгляд не особо полезно
источник

МБ

Михаил Бахтерев in Compiler Development
Алексей
А монады тут как помогут?
Ну... Они задают каркас логики компоновки. return и join с определёнными законами над этими операциями.

Нужно представить данные в подходящем для join и return виде, и от этого структура кода очень часто существенно упрощается.

Это, как мне представляется, походе просто на математическое моделирование. Мы же описываем натуральными числами любые количества. Ту точно так же, мы описываем монадами любые компоновки из частей в целое.
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Ну... Они задают каркас логики компоновки. return и join с определёнными законами над этими операциями.

Нужно представить данные в подходящем для join и return виде, и от этого структура кода очень часто существенно упрощается.

Это, как мне представляется, походе просто на математическое моделирование. Мы же описываем натуральными числами любые количества. Ту точно так же, мы описываем монадами любые компоновки из частей в целое.
Каркас и так уже задан в императивных языках
источник

А

Алексей in Compiler Development
def combinator(s):
 r1 = parser1(s)
 r2 = parser2(s)
 return (r1, r2)

vs
combinator = do
 r1 <- parser1
 r2 <- parser2
 return (r1, r2)

а в чём собственно принципиальная разница?
источник

МБ

Михаил Бахтерев in Compiler Development
Алексей
Каркас и так уже задан в императивных языках
Неа. Вот, простой пример: посчитать, скажем, сумму длин идентификаторов в AST программы. Одной ; вы не обойдётесь. Нужен ещё + в некотром виде. Вот монады они как раз о том, как на основе + ; и прочих примитивов накостылять себе компоновку результатов обработки разных веток AST.
источник

А

Алексей in Compiler Development
Peter Sovietov
Для обхода деревьев достаточно иметь набор выразительных комбинаторов (topdown, bottomup и проч.), а также иметь способ неявной передачи состояния между ними. И все, какие там монады! %)
Вот рецепт решения собственно
источник

МБ

Михаил Бахтерев in Compiler Development
Алексей
def combinator(s):
 r1 = parser1(s)
 r2 = parser2(s)
 return (r1, r2)

vs
combinator = do
 r1 <- parser1
 r2 <- parser2
 return (r1, r2)

а в чём собственно принципиальная разница?
Не знаю. Всё зависит от того, как r и s устроены. Монады, они про то, как наиболее удачно организовывать эти r и s, чтобы потом было поменьше проблем.
источник

МБ

Михаил Бахтерев in Compiler Development
P.S. Синтаксис вообще не важен.
источник

А

Алексей in Compiler Development
r - это просто результат, он тут роли вообще никакой не играет, ни в одной из версий
s - собственно скорее всего будет итератором (мутабельным) или чем-то похожим
источник

K

Kakadu in Compiler Development
Я предлагаю предъявить императивщикам статью https://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf, чтобы они показали как это красиво пишется без монад, а потом обсудить. Вдруг монады правда не так уж полезны для описанной задачи
источник

А

Алексей in Compiler Development
Kakadu
Я предлагаю предъявить императивщикам статью https://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf, чтобы они показали как это красиво пишется без монад, а потом обсудить. Вдруг монады правда не так уж полезны для описанной задачи
что именно?
источник