ReaderWriterMonad
Oct. 9th, 2010 11:10 pmЧто-то задолбало меня в кодогенераторе таскать по функциям руками модель, окружение и контекст кодогенерации и результат, решил глянуть на монады (ака "computational workflows" в F#).
По идее, там гибрид Reader, Writer и State монад - модель и окружение только читаются, результат пишется, контекст и читается и пишется. Но это пока только первоначальный вариант, я сходу более адекватного ничего не придумал.
Ну что я могу сказать - в отсутствие typeclasses и немного ограниченном выводе типов это в некотором роде превращается в тыкву, но это не так страшно.
А вот то, что понять и отладить это в принципе невозможно - это факт. Монадический код компилятором de-sugar-ится в последовательность вызовов класса-билдера(Return,Bind и еще куча дополнительных методов), причем процесс этот далеко не самоочевидный, а уж процесс выполнения так и вообще похож на броуновское движение по коду.
По идее, можно было бы пойти ООП-шным путем, положив модель и окружение в поля объекта, а результат оставить как и был - ленивый список(на самом деле sequence) строк, тем более что эти sequence на самом деле тоже сделаны из монад где-то в дебрях компилятора, и я не уверен что мой синтаксис будет более адекватен, чем уже существующий.
PS: Я не знаю, чо я сделал, но оно вообще-то работает.
По идее, там гибрид Reader, Writer и State монад - модель и окружение только читаются, результат пишется, контекст и читается и пишется. Но это пока только первоначальный вариант, я сходу более адекватного ничего не придумал.
Ну что я могу сказать - в отсутствие typeclasses и немного ограниченном выводе типов это в некотором роде превращается в тыкву, но это не так страшно.
А вот то, что понять и отладить это в принципе невозможно - это факт. Монадический код компилятором de-sugar-ится в последовательность вызовов класса-билдера(Return,Bind и еще куча дополнительных методов), причем процесс этот далеко не самоочевидный, а уж процесс выполнения так и вообще похож на броуновское движение по коду.
По идее, можно было бы пойти ООП-шным путем, положив модель и окружение в поля объекта, а результат оставить как и был - ленивый список(на самом деле sequence) строк, тем более что эти sequence на самом деле тоже сделаны из монад где-то в дебрях компилятора, и я не уверен что мой синтаксис будет более адекватен, чем уже существующий.
PS: Я не знаю, чо я сделал, но оно вообще-то работает.