Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 44

Тема: Макросы ОЛ: с побочными эффектами и/или детерминированные?

  1. #11
    Пользователь Аватар для anthrwpos
    Регистрация
    13.02.2017
    Адрес
    Ленобл
    Сообщений
    188

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Контраргументы простые и не менялись с самого моего первого сообщения.
    Аргумента у SR два. Аргумента типа "развёртка входов во времени" у SR просто-напросто нет.
    тогда предлагаю такой вариант:
    у SR два аргумента: история состояний подаваемых на S и история состояний подаваемых на R. Выход - история выходных состояний. Почему нет ?

  2. #12
    Пользователь Аватар для anthrwpos
    Регистрация
    13.02.2017
    Адрес
    Ленобл
    Сообщений
    188

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Делаю ставку на то, что тут вы пропихиваете дополнительный аргумент через 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.

  3. #13
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    как много хаскеля стало https://m.habrahabr.ru/post/327026/ оказывается
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  4. #14

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Пример использования...
    здесь в функции main вызывается функция execState, которой передается начальное состояние и которая возвращает конечное состояние.
    execState получив начальное состояние запускает функцию prc, где мы производим различные вычисления с использованием SR-триггера путем вызова функции set_reset.
    Вообще мы конечно можем там и любой другой код написать, где мы например, вычисляем с какими входами вызывать set_reset.
    Т.е. всё, как я и говорил: вы здесь в функцию set_reset передаёте "состояние триггера".
    Да, в вашем исполнении функция set_reset является чистой, но вы жульничаете в том плане, что помимо S и R аргументов передаёте дополнительный аргумент с состоянием триггера.

    Иначе говоря: SR_triger(S, R, prevState) можно называть чистой функцией.

    Но мы говорим про ОЛ. В ОЛ у SR-триггера всего два входа.
    Ну и сами же говорили, что у SR-триггера ДВА аргумента.


    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Еще как возможно. На этом весь Хаскель и сделан.
    В вышеприведенном примере мы используем монаду State, которая создает свое внутреннее локальное состояние. Её использование совершенно не нарушает чистоты языка.
    В частности, вы можете прочитать это состояние из любой чистой функции и она останется чистой функцией, потому что читается локальное, внутреннее состояние. Но никакая чистая функция не может прочитать глобальное внешнее состояние создаваемое монадой IO.
    Да да да.

    По-вашему, любой ФБ является "чистым"?
    По-вашему, любая программа из ФБ, не обращающаяся к файлам/IO является "чистой"?

  5. #15

    По умолчанию

    Собственно: да, для любой ОЛ программы/макроса можно составить Haskell программу, которая ведёт себя так же (ну, возвращает те же значения при тех же входах).
    Работу с сетевыми переменными пока опустим. Даже работу с временем можно опустить (хотя я ни разу не соглашусь, что "ОЛ blink это читая функция")

    Но значит ли это, что любая ОЛ программа является "чистой"? Вовсе нет. Или, по-вашему, действительно любая ОЛ программа является "чистой", "детерминированной" и "без побочных эффектов"?
    Поэтому неправильно "оправдывать ОЛ" словами <<У макроса на вход помимо его реальных аргументов есть ещё "аргумент с состоянием", который передаётся неявно>>.

    Да нет никакого дополнительного аргумента у ОЛ макроса.
    Запускаешь ОЛ макрос 2 раза -- и он возвращает разное. По определению это означает, что макрос не является детерминированным. Какие ещё разговоры могут быть?
    Последний раз редактировалось Владимир Ситников; 21.04.2017 в 10:21.

  6. #16

    По умолчанию

    Если пользоваться критерием "программу можно перевести на Haskell, а там все функции чистые, значит в исходной программе тоже всё <<чисто>>", то так можно дойти до того, что вообще все языки программирования основаны на чистых функциях. Разумеется, это бред, ведь Haskell Тьюринг-полный и на него можно перевести любую программу с любого другого языка.

    Поэтому для определения "чистоты" нужно не просто говорить "ежу понятно, что в ОЛ макросы являются чистыми", а подтверждать это со ссылкой на определение.
    И я не устану повторять, что никакого скрытого аргумента "Control.Monad.State" у ОЛ макроса нет. Есть только те аргументы, которые выведены на экран у самого макроса.

  7. #17
    Пользователь Аватар для anthrwpos
    Регистрация
    13.02.2017
    Адрес
    Ленобл
    Сообщений
    188

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Т.е. всё, как я и говорил: вы здесь в функцию set_reset передаёте "состояние триггера".
    Таки нет!)
    Посмотрите на сигнатуру set_reset. Она принимает только два Bool аргумента и никаких предыдущих состояний)
    Состояние содержится внутри функции prc, которую мы вызываем посредством execState.
    По-вашему, любая программа из ФБ, не обращающаяся к файлам/IO является "чистой"?
    Почти так. Всё, что не имеет никаких средств для обращения к IO по видимому, является чистым.

  8. #18

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Почти так. Всё, что не имеет никаких средств для обращения к IO по видимому, является чистым.
    О, круто (с вашего позволения, я пока не буду отвечать про сигнатуру set_reset)


    Давайте посмотрим на такой код на C:

    Код:
    int counter = 0;
    
    int abcd() {
      counter = counter + 1;
      return counter;
    }
    Внимание, вопрос: является ли функция abcd чистой?
    Очевидно, что IO эта функция не выполняет.

  9. #19
    Пользователь Аватар для anthrwpos
    Регистрация
    13.02.2017
    Адрес
    Ленобл
    Сообщений
    188

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Собственно: да, для любой ОЛ программы/макроса можно составить Haskell программу, которая ведёт себя так же
    Ну сам по себе blink написать нельзя, ибо чистая программа не имеет доступа к системному времени и не может рассчитать время цикла. Но если время
    цикла постулировать как константу, можно чистым образом и блинк сделать)
    Но значит ли это, что любая ОЛ программа является "чистой"?
    Разумеется нет. ОЛ программа читает входы и записывает выходы.
    Я продвигаю идею о чистоте только макросов.

  10. #20
    Пользователь Аватар для anthrwpos
    Регистрация
    13.02.2017
    Адрес
    Ленобл
    Сообщений
    188

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Давайте посмотрим на такой код на C:

    Код:
    int counter = 0;
    
    int abcd() {
      counter = counter + 1;
      return counter;
    }
    Внимание, вопрос: является ли функция abcd чистой?
    Очевидно, что IO эта функция не выполняет.
    Нет, поскольку эта функция может читать ввод посредством некой другой функции, которая будет записывать его в переменную counter.

    А в хаскеле вы из монады IO повлиять на состояние монады State не можете никак =)

Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя

Похожие темы

  1. Специальные ,функционально законченные макросы
    от rovki в разделе Программируемые реле
    Ответов: 135
    Последнее сообщение: 14.02.2024, 12:43
  2. Универсальные макросы для OWEN Logic
    от rovki в разделе Среда программирования OWEN Logic
    Ответов: 827
    Последнее сообщение: 22.12.2023, 13:20
  3. макросы для ПР200.
    от Павел Братковский в разделе Среда программирования OWEN Logic
    Ответов: 174
    Последнее сообщение: 17.05.2020, 19:34
  4. Макросы для КаСкады
    от rovki в разделе Программируемые реле
    Ответов: 19
    Последнее сообщение: 04.09.2016, 10:08
  5. Макросы -- объясните немного....
    от tigdin в разделе Программируемые реле
    Ответов: 20
    Последнее сообщение: 28.08.2014, 15:18

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •