Haskell - это чистый функциональный язык, что означает, что функции Haskell не имеют побочных эффектов. I/O реализуется с использованием монад, представляющих куски вычислений ввода-вывода.
Можно ли проверить возвращаемое значение функций ввода/вывода Haskell?
Скажем, у нас есть простая программа "hello world":
main :: IO ()
main = putStr "Hello world!"
Возможно ли создать тестовый жгут, который может запускать main
, и проверить, чтобы монада ввода/вывода вернула правильное значение? Или тот факт, что монады должны быть непрозрачными блоками вычислений, мешает мне это делать?
Заметьте, я не пытаюсь сравнивать возвращаемые значения операций ввода-вывода. Я хочу сравнить возвращаемое значение функций ввода-вывода - сама монада ввода-вывода.
Так как в Haskell I/O возвращается, а не выполняется, я надеялся изучить кусок вычисления ввода-вывода, возвращаемый функцией ввода-вывода, и посмотреть, правильно ли оно было. Я думал, что это может позволить тестировать модули ввода/вывода таким образом, чтобы они не были в императивных языках, где I/O является побочным эффектом.