Если пользоваться критерием "программу можно перевести на Haskell, а там все функции чистые, значит в исходной программе тоже всё <<чисто>>", то так можно дойти до того, что вообще все языки программирования основаны на чистых функциях. Разумеется, это бред, ведь Haskell Тьюринг-полный и на него можно перевести любую программу с любого другого языка.

Поэтому для определения "чистоты" нужно не просто говорить "ежу понятно, что в ОЛ макросы являются чистыми", а подтверждать это со ссылкой на определение.
И я не устану повторять, что никакого скрытого аргумента "Control.Monad.State" у ОЛ макроса нет. Есть только те аргументы, которые выведены на экран у самого макроса.