В сообщениях блога и примерах Марка Симанна я впервые увидел свободных монад как способ структурировать границу между чистым кодом и кодом ввода-вывода. Я понимаю, что свободная монада позволяет вам построить программу (абстрактное синтаксическое дерево - AST) из чистых функций, которые интерпретатор затем преобразует в последовательность вызовов нечистых процедур. Следовательно, этот интерпретатор превращает чистые операции AST в последовательность монадических операций ввода-вывода.
Мне интересно, дублирует ли это то, что среда выполнения Haskell уже делает с монадой ввода-вывода. Если я рассматриваю ввод-вывод как ничего особенного, а как обычную монаду, чья функция связывания >>=
упорядочивает состояние «Реального мира» через все монадические операции в вводе-выводе, тогда это упорядочение не обеспечивает никаких вычислений само по себе (как объяснено для свободных монад в отличный ответ здесь). Затем я могу просматривать все действия ввода-вывода, такие как getLine
, writeFile
и т.п., как операции в свободной монаде ввода-вывода, а среду выполнения Haskell - как интерпретатор. Среда выполнения интерпретирует каждое действие ввода-вывода с помощью некоторого базового системного вызова, вызова C FFI или тому подобного, что явно нечисто.
Итак, в этом представлении функции, возвращающие действия ввода-вывода, просто создают AST, который затем интерпретируется средой выполнения Haskell. Но до этого момента все чисто. С этой точки зрения функция a -> IO b
не является нечистой, точно так же, как операция над свободной монадой не является нечистой.
Верна ли эта интуиция? Если нет, то в чем его недостатки?
IO
, так и для бесплатных монад - person Fyodor Soikin   schedule 15.05.2020