Что произойдет, если скомпилировать программу, которая не принимает никаких входных данных? (Вопросы чистоты IO в Haskell (снова))

putStrLn при вызове с любыми аргументами всегда будет возвращать значение типа IO (). Я согласен, что это чисто, я могу с этим справиться. Но прозрачно ли это ссылочно? Я думаю, да, потому что для любого заданного ввода вы можете заменить вызов функции на IO (), который выбросит правильную строку в stdout.

Так что я не против putStrLn, но getLine при вызове без аргументов может вернуть любое количество вещей, если они имеют тип IO String. Это не является ни чистым, ни ссылочно прозрачным?

Глупый педантичный вопрос, который, вероятно, не изменит то, как я пишу свой код, но я действительно хочу разобраться с этим раз и навсегда. (Я понимаю, что монада IO правильно выстроит последовательность действий, но это не моя проблема)

Это поднимает еще один вопрос. Достаточно ли умён компилятор, чтобы распознать программу, которая не принимает входных данных? Например, если я компилирую

main = putStrLn . show $ map (+1) [1..10]

Достаточно ли GHC умен, чтобы свести эту программу к IO (), которая приводит к выводу [2,3,4,5,6,7,8,9,10,11]? Или он все же обрабатывает это и оценивает/выполняет все во время выполнения? То же самое касается произвольных программ, где ввод не требуется. Использует ли GHC тот факт, что вся программа является ссылочно прозрачной и может быть просто заменена ее значением?

7
задан Aza 15 April 2013 в 03:14
поделиться