Size: a a a

Compiler Development

2020 May 05

AT

Alexander Tchitchigi... in Compiler Development
Это же причина, по которой нельзя автоматически лифтить одну монаду в другую -- нужно трансформеры руками писать. Потому что неизвестно как правильно разные эффекты комбинировать. Приходится каждый раз отдельно разбираться.
источник

А

Алексей in Compiler Development
Alexander Tchitchigin
Продолжения на генераторах сделать нельзя по построению -- генератор не захватывает продолжение за пределами генератора. Так что они строго менее выразительные, чем монады. Вопрос на этом можно закрыть.
Почему не может?
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Человек то ли не понимает, что такое монады, то ли намеренно вводит публику в заблуждение. С теоретической точки зрения монады как раз и описывают машинный код (протаскивают состояние машины через цепочку инструкций). Их изначально в семантику для этого и ввели. Потому что с чисто функциональной точки зрения машинный код - это нонсенс, а денотационная семантика чисто функциональна. Вот эту проблему несоответствия и решили монадами/комонадами.

Абстракции не ломаются, просто одна монада трансформируется в другую.

На практике, с математической (логической) точки зрения, мы всегда работаем в монадах. Монады повсеместны там, где есть хотя бы переменные. Превращение колец в кольца многочленов - это тоже монады.

Самый ли это удобный способ выражения программ? Не знаю. Спорный вопрос. Вот в Lisp-ах мы всегда неявно живём в монаде списков, явно нигде монады не упоминаются, и это позволяет матрицы транспонировать через (apply map list M), и это круто.

Может, явный синтаксис для монад и не нужен, но знать про них и уметь с ними работать - навык полезный.
Протаскивают состояние машины через цепочку инструкций - это не монада. Операций bind и pure в явном виде там нет. Переопределить их и просто так запустить код в другой монаде не представляется возможным, за исключением компиляции из языка, где эти монады имеются. Да и сама компиляция будет не слишком тривиальна, если хочется получить эффективный код.
источник

А

Алексей in Compiler Development
А так конечно можно при желании и ООП на что угодно натянуть и сказать что любые вычисления - это взаимодействия некоторых объектов некоторых классов.
источник

А

Алексей in Compiler Development
Алексей
Протаскивают состояние машины через цепочку инструкций - это не монада. Операций bind и pure в явном виде там нет. Переопределить их и просто так запустить код в другой монаде не представляется возможным, за исключением компиляции из языка, где эти монады имеются. Да и сама компиляция будет не слишком тривиальна, если хочется получить эффективный код.
Ну и как следствие, во многих языках нельзя просто так взять и закинуть вычисления в другую монаду.
источник

МБ

Михаил Бахтерев... in Compiler Development
Там есть явный bind - граница между двумя инструкциями. И есть яный pure - это оформление кода в виде вызывемой подпрограммы. Учите матчасть, как бы. Дело всё именно в логике и математике, а не каких-то персональных хотелках. Людям нужен был формализм для описания семантики ассемблера в функциональном стиле, они его и вывели. Понятно, что могут быть и другие стили. Но если мы хотим какого-то алгебраического математического описания на языке функций, монады возникают естественно. Только об этом речь.

Проблема тут только в том, что в математике у нас основной язык - это язык функций. ООП в математике нет, поэтому его и не втащил никто в денотационную семантику. А функции есть, поэтому из них всё и построено (в том числе и ООП).

Особенность подхода, и только. Это ж не религия, а просто полезный инструмент.
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Там есть явный bind - граница между двумя инструкциями. И есть яный pure - это оформление кода в виде вызывемой подпрограммы. Учите матчасть, как бы. Дело всё именно в логике и математике, а не каких-то персональных хотелках. Людям нужен был формализм для описания семантики ассемблера в функциональном стиле, они его и вывели. Понятно, что могут быть и другие стили. Но если мы хотим какого-то алгебраического математического описания на языке функций, монады возникают естественно. Только об этом речь.

Проблема тут только в том, что в математике у нас основной язык - это язык функций. ООП в математике нет, поэтому его и не втащил никто в денотационную семантику. А функции есть, поэтому из них всё и построено (в том числе и ООП).

Особенность подхода, и только. Это ж не религия, а просто полезный инструмент.
Нет этого полезного инструмента во многих языках. В том числе и в ассемблере
источник

А

Алексей in Compiler Development
Нету там bind в явном виде
источник

А

Алексей in Compiler Development
Нет инструментов чтобы сделать свой bind
источник

А

Алексей in Compiler Development
В машинном коде есть только регистры, память и инструкции
источник

AT

Alexander Tchitchigi... in Compiler Development
Алексей
Почему не может?
По построению. Генераторы так устроены. 😊
источник

МБ

Михаил Бахтерев... in Compiler Development
Алексей
Нет этого полезного инструмента во многих языках. В том числе и в ассемблере
Я вам о математике, а Вы мне о байтиках. Ну, ладно. Не хотите пользоваться - не пользуйтесь :) Не понятно только, зачем отговаривать тех, кто пользуется?
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Я вам о математике, а Вы мне о байтиках. Ну, ладно. Не хотите пользоваться - не пользуйтесь :) Не понятно только, зачем отговаривать тех, кто пользуется?
Вы не можете пользоваться монадами там где их нет. Уж извините.
источник

А

Алексей in Compiler Development
Alexander Tchitchigin
По построению. Генераторы так устроены. 😊
Как устроены? Генераторы могут возвращать значение во вне, принимать значение извне, запускать другие генераторы в том же контексте (в том же итераторе). Что ещё надо?
источник

МБ

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

А

Алексей in Compiler Development
Железо вообще не про какие монады не слышало. Да и о порядке вычисления имеет своё представление.
источник

AZ

Alexander Zalutskiy in Compiler Development
Алексей
Железо вообще не про какие монады не слышало. Да и о порядке вычисления имеет своё представление.
Железо много о чем не слышало, но это не мешает разработчикам использовать концепты :/
источник

А

Алексей in Compiler Development
Более того. Даже функций (в императивном смысле, да и в функциональном тоже) как отдельной абстракции как таковых в машинном коде нет.
источник

А

Алексей in Compiler Development
Alexander Zalutskiy
Железо много о чем не слышало, но это не мешает разработчикам использовать концепты :/
Разработчики могут спокойно использовать конечно же, но уже на несколько другом уровне абстракции
источник

МБ

Михаил Бахтерев... in Compiler Development
Алексей
Более того. Даже функций (в императивном смысле, да и в функциональном тоже) как отдельной абстракции как таковых в машинном коде нет.
Машинный код - это данные. В нём вообще ничего нет бнз интерпретатора.
источник