Haskell - это чистый функциональный язык, что означает, что функции Haskell не имеют побочных эффектов. I/O реализуется с использованием монад, представляющих куски вычислений ввода-вывода.Можно ли проверить возвращаемое значение функций ввода/вывода Haskell?
Можно ли проверить возвращаемое значение функций ввода/вывода Haskell?
Допустим, мы имеем простую программу «привет мир»:
main :: IO()
main = putStr "Hello world!"
это возможно для меня, чтобы создать тестовую, который может работать main
и проверить, что/O монады I возвращает правильный 'стоимость'? Или тот факт, что монады должны быть непрозрачными блоками вычислений, мешает мне это делать?
Примечание. Я не пытаюсь сравнивать возвращаемые значения операций ввода-вывода. Я хочу сравнить возвращаемое значение функций ввода/вывода - сама монада ввода-вывода.
Поскольку в Haskell I/O возвращается, а не выполняется, я надеялся изучить кусок вычисления ввода-вывода, возвращенный функцией ввода-вывода, и посмотреть, правильно ли оно было. Я думал, что это может позволить тестировать модули ввода/вывода таким образом, чтобы они не были в императивных языках, где I/O является побочным эффектом.
Монады не обязательно являются «непрозрачными» блоками вычислений. Например, монады List и Maybe имеют видимое поведение приложения. Монада IO - единственная (я знаю), специально разработанная для изолирования логики программы от некоторого ее поведения. –
Control.Monad.ST также довольно непрозрачен. – ephemient
Я не очень хорошо разбираюсь в теории вычислительной теории. Но разве это не эквивалентно проблеме остановки? Я имею в виду, что у вас будет функция, которая возвращает программу (действие IO), и вы хотите написать другую программу, чтобы статически анализировать ее для правильности. Это правильный способ описать проблему? Это разрешимо? –