Собственно: да, для любой ОЛ программы/макроса можно составить Haskell программу, которая ведёт себя так же (ну, возвращает те же значения при тех же входах).
Работу с сетевыми переменными пока опустим. Даже работу с временем можно опустить (хотя я ни разу не соглашусь, что "ОЛ blink это читая функция")
Но значит ли это, что любая ОЛ программа является "чистой"? Вовсе нет. Или, по-вашему, действительно любая ОЛ программа является "чистой", "детерминированной" и "без побочных эффектов"?
Поэтому неправильно "оправдывать ОЛ" словами <<У макроса на вход помимо его реальных аргументов есть ещё "аргумент с состоянием", который передаётся неявно>>.
Да нет никакого дополнительного аргумента у ОЛ макроса.
Запускаешь ОЛ макрос 2 раза -- и он возвращает разное. По определению это означает, что макрос не является детерминированным. Какие ещё разговоры могут быть?