Бог, я ненавижу термин "запах кода", но я не могу придумать ничего более точного.
Я разрабатываю язык высокого уровня и компилятор для Whitespace в свое свободное время, чтобы узнать о построении компилятора, и функциональное программирование (компилятор записывается в Haskell).
Во время фазы генерации кода компилятора я должен поддерживать данные "state" -ish, когда я пересекаю дерево синтаксиса. Например, при компиляции операторов управления потоком мне нужно создать уникальные имена для ярлыков, на которые можно перейти (метки, созданные с помощью счетчика, который был передан, обновлен и возвращен, а старое значение счетчика никогда не должно использоваться снова). Другим примером является то, что когда я сталкиваюсь с строковыми литералами в синтаксическом дереве, они должны быть постоянно преобразованы в переменные кучи (в Whitespace строки лучше всего хранятся в куче). В настоящее время я завершаю весь модуль генерации кода в государственной монаде, чтобы справиться с этим.
Мне сказали, что писать компилятор - это проблема, хорошо подходящая для функциональной парадигмы, но я нахожу, что я ее проектирую точно так же, как я бы ее проектировал на C (вы действительно можете писать C в любом язык - даже Haskell w/state monads).
Я хочу научиться думать в Haskell (скорее, в функциональной парадигме) - не в C с синтаксисом Haskell. Должен ли я действительно попытаться устранить/свести к минимуму использование государственной монады или это законный функциональный "шаблон дизайна"?