Функции в Haskell никогда не имеют побочных эффектов.
Есть только значения с побочными эффектами, например getLine
(это значение, а не функция). getLine
- это инструкция "прочитать строку текста из стандартного в". Это не функция, которая выполняет инструкцию, она является инструкцией.
И putStrLn
не является функцией, которая записывает текст в стандартный формат. putStrLn
- это функция, которая принимает строку в качестве параметра и возвращает инструкцию для записи этой строки в стандартный формат.
Нет проблем с хранением этих инструкций в чистых структурах данных. Однако если вы хотите выполнить их, то в какой-то момент они должны быть частью значения основной программы main
.