Пример использования
здесь в функции main вызывается функция execState, которой передается начальное состояние и которая возвращает конечное состояние.Код: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
execState получив начальное состояние запускает функцию prc, где мы производим различные вычисления с использованием SR-триггера путем вызова функции set_reset.
Вообще мы конечно можем там и любой другой код написать, где мы например, вычисляем с какими входами вызывать set_reset.
Еще как возможно. На этом весь Хаскель и сделан.Да, про файлы всё верно пишете.
Но я хотел бы подчеркнуть, что вы напираете на слово "внешнее окружение", а с математической (она же computer science) точки зрения, невозможно определить что именно является "внешним окружением".
В вышеприведенном примере мы используем монаду State, которая создает свое внутреннее локальное состояние. Её использование совершенно не нарушает чистоты языка.
В частности, вы можете прочитать это состояние из любой чистой функции и она останется чистой функцией, потому что читается локальное, внутреннее состояние. Но никакая чистая функция не может прочитать глобальное внешнее состояние создаваемое монадой IO.
как много хаскеля стало https://m.habrahabr.ru/post/327026/ оказывается
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Т.е. всё, как я и говорил: вы здесь в функцию set_reset передаёте "состояние триггера".
Да, в вашем исполнении функция set_reset является чистой, но вы жульничаете в том плане, что помимо S и R аргументов передаёте дополнительный аргумент с состоянием триггера.
Иначе говоря: SR_triger(S, R, prevState) можно называть чистой функцией.
Но мы говорим про ОЛ. В ОЛ у SR-триггера всего два входа.
Ну и сами же говорили, что у SR-триггера ДВА аргумента.
Да да да.
По-вашему, любой ФБ является "чистым"?
По-вашему, любая программа из ФБ, не обращающаяся к файлам/IO является "чистой"?
Собственно: да, для любой ОЛ программы/макроса можно составить Haskell программу, которая ведёт себя так же (ну, возвращает те же значения при тех же входах).
Работу с сетевыми переменными пока опустим. Даже работу с временем можно опустить (хотя я ни разу не соглашусь, что "ОЛ blink это читая функция")
Но значит ли это, что любая ОЛ программа является "чистой"? Вовсе нет. Или, по-вашему, действительно любая ОЛ программа является "чистой", "детерминированной" и "без побочных эффектов"?
Поэтому неправильно "оправдывать ОЛ" словами <<У макроса на вход помимо его реальных аргументов есть ещё "аргумент с состоянием", который передаётся неявно>>.
Да нет никакого дополнительного аргумента у ОЛ макроса.
Запускаешь ОЛ макрос 2 раза -- и он возвращает разное. По определению это означает, что макрос не является детерминированным. Какие ещё разговоры могут быть?
Последний раз редактировалось Владимир Ситников; 21.04.2017 в 10:21.
Если пользоваться критерием "программу можно перевести на Haskell, а там все функции чистые, значит в исходной программе тоже всё <<чисто>>", то так можно дойти до того, что вообще все языки программирования основаны на чистых функциях. Разумеется, это бред, ведь Haskell Тьюринг-полный и на него можно перевести любую программу с любого другого языка.
Поэтому для определения "чистоты" нужно не просто говорить "ежу понятно, что в ОЛ макросы являются чистыми", а подтверждать это со ссылкой на определение.
И я не устану повторять, что никакого скрытого аргумента "Control.Monad.State" у ОЛ макроса нет. Есть только те аргументы, которые выведены на экран у самого макроса.
Таки нет!)
Посмотрите на сигнатуру set_reset. Она принимает только два Bool аргумента и никаких предыдущих состояний)
Состояние содержится внутри функции prc, которую мы вызываем посредством execState.Почти так. Всё, что не имеет никаких средств для обращения к IO по видимому, является чистым.По-вашему, любая программа из ФБ, не обращающаяся к файлам/IO является "чистой"?
О, круто (с вашего позволения, я пока не буду отвечать про сигнатуру set_reset)
Давайте посмотрим на такой код на C:
Внимание, вопрос: является ли функция abcd чистой?Код:int counter = 0; int abcd() { counter = counter + 1; return counter; }
Очевидно, что IO эта функция не выполняет.
Ну сам по себе blink написать нельзя, ибо чистая программа не имеет доступа к системному времени и не может рассчитать время цикла. Но если время
цикла постулировать как константу, можно чистым образом и блинк сделать)
Разумеется нет. ОЛ программа читает входы и записывает выходы.Но значит ли это, что любая ОЛ программа является "чистой"?
Я продвигаю идею о чистоте только макросов.