Сообщение от
Владимир Ситников
Делаю ставку на то, что тут вы пропихиваете дополнительный аргумент через pointfree.
На вопрос "сколько аргументов у SR-триггера" вы отвечаете два, но тут дополнительно подали аргумент "историю прошлых серий" он же "глобальное состояние".
Если объяснение неверное, то я попрошу вас дописать пример использования этого самого SR-триггера и всё встанет на свои места.
Пример использования
Код:
module Hs where
import Control.Monad.State
set_reset :: Bool -> Bool -> State Bool ()
set_reset False False = state (\w -> ((),w))
set_reset True False = state (\_ -> ((),True))
set_reset _ True = state (\_ -> ((),False))
main :: IO ()
main = print $ execState prc False
prc :: State Bool ()
prc = do
set_reset True False
set_reset False False
здесь в функции main вызывается функция execState, которой передается начальное состояние и которая возвращает конечное состояние.
execState получив начальное состояние запускает функцию prc, где мы производим различные вычисления с использованием SR-триггера путем вызова функции set_reset.
Вообще мы конечно можем там и любой другой код написать, где мы например, вычисляем с какими входами вызывать set_reset.
Да, про файлы всё верно пишете.
Но я хотел бы подчеркнуть, что вы напираете на слово "внешнее окружение", а с математической (она же computer science) точки зрения, невозможно определить что именно является "внешним окружением".
Еще как возможно. На этом весь Хаскель и сделан.
В вышеприведенном примере мы используем монаду State, которая создает свое внутреннее локальное состояние. Её использование совершенно не нарушает чистоты языка.
В частности, вы можете прочитать это состояние из любой чистой функции и она останется чистой функцией, потому что читается локальное, внутреннее состояние. Но никакая чистая функция не может прочитать глобальное внешнее состояние создаваемое монадой IO.