Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 21 по 30 из 44

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

  1. #21

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Нет, поскольку эта функция может читать ввод посредством некой другой функции, которая будет записывать его в переменную counter.
    Чего чего?
    "функция может читать ввод посредством некой другой функции" ?

    О чём вообще речь. IO в программе вообще не происходит. Тут же просто сложение.
    Скажите, пожалуйста, по какому принципу вы относите эту функцию abcd к нечистым?

    Я могу добавить больше ограничений: никакая другая функция не обращается к переменной counter. Ни пишет, ни читает.
    Что? abcd это чистая функция в таком случае?

  2. #22

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Ну сам по себе blink написать нельзя, ибо чистая программа не имеет доступа к системному времени и не может рассчитать время цикла. Но если время
    цикла постулировать как константу, можно чистым образом и блинк сделать)
    Что за бред? На Haskell нельзя написать blink?
    Вы в своём уме? Data.Time.Clock и вперёд.
    Становятся ли Haskell функции от этого нечистыми? Нет. Как-никак, в Haskell вообще все функции являются чистыми функциями.

    Но вы, я так понял, считаете, что "нечистые" это только те функции, которые выполняют IO (ну, читают файлы, считывают значения DI/DO).
    Да, те функции, которые читают файлы нечистые.
    Но могут быть (разумеется, не в Haskell, а в Си, в ST, в ОЛ, в МЭК61131 и т.п.) нечистыми даже те функции (ФБ, макросы), которые с файлами и IO никогда вообще не работают.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Чего чего?
    "функция может читать ввод посредством некой другой функции" ?

    О чём вообще речь. IO в программе вообще не происходит. Тут же просто сложение.
    Скажите, пожалуйста, по какому принципу вы относите эту функцию abcd к нечистым?
    Переменная которую использует эта функция глобальная. Её чтение равносильно чтению ввода, потому что к этой переменной имеет доступ любая функция в программе, в том числе и некая (предполагаемая) функция, которая может осуществлять ввод.
    То что этого не происходит в вашей конкретной программе не делает эту функцию чистой)
    Чистота функции - это свойство самой функции, оно не должно зависеть от того, как устроена ваша остальная программа.

  4. #24

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Чистота функции - это свойство самой функции, оно не должно зависеть от того, как устроена ваша остальная программа.
    О, я тоже так думаю.

    А такой код? Это чистая функция?
    На всякий, случай: static объявляет такую переменную, которая сохраняет своё состояние между вызовами функции
    Код:
    int abcd2() {
      static int counter; /* обращаем внимание на слово static */
      counter = counter + 1;
      return counter;
    }
    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Переменная которую использует эта функция глобальная. Её чтение равносильно чтению ввода, потому что к этой переменной имеет доступ любая функция в программе, в том числе и некая (предполагаемая) функция, которая может осуществлять ввод.
    Если вы говорите, что "чистота" это свойство самой функции, то непонятно как тут же поворачивается язык говорить о "к этой переменной имеет доступ некая (предполагаемая) функция, которая может осуществлять ввод".
    На этом моменте я вы предложил вам обратиться к определению чистой функции. И не к вашему личному определению, а определению из более надёжного источника. Wikipedia, книга, учебник, статья.

    В коде abcd2 к переменной counter уж точно никогда не сможет обратиться ни одна другая функция.
    Что? abcd2, получается, чистая функция?
    Последний раз редактировалось Владимир Ситников; 21.04.2017 в 14:31.

  5. #25

    По умолчанию

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

    Да, ваша прошлая реализация set_reset не получает никаких лишних скрытых аргументов, но эта реализация и не возвращает bool результат.
    Технически, ваша реализация set_reset возвращает функцию "состояние триггера должно сохраниться", "состояние триггера должно перейти в false", и т.п.
    Потом эти функции последовательно применяются к начальному состоянию.

    Да, это позволяет сделать как бы SR триггер на Haskell, но это вольная/творческая переработка ОЛ программы.

    В том же самой же среде ОЛ, SR триггер получает два bool на вход и тут же возвращает bool на выходе.

    Поэтому, переформулирую вопрос про SR-триггер.
    Реализуйте вот такой SR-триггер:
    Код:
    set_reset :: Bool -> Bool -> Bool
    set_reset s r = ...
    SR-триггер в ОЛ это именно такой блок. Получает два bool, возвращает bool. Вы утверждаете, что он чистый, значит должно быть несложно составить аналогичную Haskell функцию.
    Последний раз редактировалось Владимир Ситников; 21.04.2017 в 16:23.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Да, ваша прошлая реализация set_reset не получает никаких лишних скрытых аргументов, но эта реализация и не возвращает bool результат.
    Вот это правильно)
    Поэтому, переформулирую вопрос про SR-триггер.
    Реализуйте вот такой SR-триггер:
    Код:
    set_reset :: Bool -> Bool -> Bool
    set_reset s r = ...
    Вот такой триггер сделать невозможно.

    Поэтому я и пишу, что в моей гипотезе о возможности чистоты в смысле развертки во времени я и не уверен.
    По меньшей мере убедительных аргументов против того, что это можно назвать чистой функцией я пока не увидел.

    Поэтому я последний день и неохотно участвую в этой теме, потому что не хочу обсуждать определения чистоты из википедии непонятно на основании чего придуманные, а найти и предложить свой источник академической строгости не могу.
    Так же я не очень хотел бы зацикливаться на хаскеле, я его упомянул в смысле того, что там я видел на мой взгляд более адекватные определения чистоты, а о том, что в хаскеле невозможны функции в смысле развертки во времни я знал заранее (но купился на вашу задачку, поскольку условия были составлены неграмотно и я легко решил её через монаду состояния)

    Я хотел бы если и обсуждать чистоту функций, то на основании каких нибудь общих фундаментальных суждений вроде того, что если мы признаем такое-то определение чистоты, то получим такие-то неприятности с ним связанные.
    Никаких фундаментальных недостатков чистоты в смысле развертки во времени я пока не нашел.

  7. #27

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Вот такой триггер сделать невозможно.
    Ну вы же сами только что сказали, что вот такой SR-триггер не является чистой функцией:
    Код:
    set_reset :: Bool -> Bool -> Bool
    set_reset s r = ...
    "такой триггер сделать невозможно", значит оно не является чистой функцией.
    Если бы было сделать возможно, то это была бы чистая функция.

    Я намеренно исключаю возможность существования таких чистых функций, которые на Haskell невозможно выразить. Не хочу вдаваться в детали, но наверняка возможность записи любой функции доказывается через какую-нибудь муть типа лямбда-исчисления.

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Никаких фундаментальных недостатков чистоты в смысле развертки во времени я пока не нашел.
    Где ищите?
    Хоть что-нибудь читаете?

    Вот пример:

    https://www.schoolofhaskell.com/scho...ns-laziness-io
    Here are the fundamental properties of a pure function:

    1. A function returns exactly the same result every time it's called with the same set of arguments. In other words a function has no state, nor can it access any external state. Every time you call it, it behaves like a newborn baby with blank memory and no knowledge of the external world.
    2. A function has no side effects. Calling a function once is the same as calling it twice and discarding the result of the first call. In fact if you discard the result of any function call, Haskell will spare itself the trouble and will never call the function. No wonder Haskell has a reputation for laziness (more about it later).
    Смотрите внимательно на пункт №1. И читайте: "returns exactly the same result every time it's called with the same set of arguments".
    Ваша set_reset функция при вызове set_reset False False реально возвращает одну и ту же функцию.
    Тут "развёртка по времени" не играет никакой роли. Всё очень просто: вызвали set_reset False False -- получили в ответ одну и ту же функцию. Правда, полученная функция не имеет ничего общего с состоянием какого-либо SR триггера в ОЛ программе, но не суть.

    Теперь же про ОЛ: там мы вызвали SR триггер с аргументами FALSE, FALSE. И что он нам вернёт? TRUE? FALSE? Да пёс его знает, ведь возвращённое значение зависит от того, чему равно состояние триггера перед вызовом.


    Теперь про abcd2.
    Функция abcd2 при двух вызовах с одними и теми же аргументами возвращает разные результаты. При этом, вообще неважно где именно она хранит состояние переменной counter. Хоть "внутри функции", хоть "в глобальной области", хоть в регистре процессора. Это неважно. Важно то, что вызвали два раза с одинаковыми аргументами, а она, собака, вернула разные значения. Всё, баста карапузики, эта функция "не является детерминированной", и, значит, она не может являться "чистой" функцией.
    Если не нравится слово "не является детерминированной", то можно с тем же успехом процитировать статью: не выполнено свойство "A function returns exactly the same result..."

    Именно из-за этого сами функции abcd и abcd2 не являются чистыми функциями.
    Заметьте, я вообще не использовал при этом "вспомогательные гипотетические функции, которые могут читать-писать counter".
    Мне достаточно того факта, что "вызвали функцию, она вернула разное, значит не чистая".
    Последний раз редактировалось Владимир Ситников; 21.04.2017 в 19:36.

  8. #28

    По умолчанию

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Вот такой триггер сделать невозможно.
    Ну и самый главный вывод: я хочу, чтобы вы признали свою ошибку в словах

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    PS ОЛ по сути есть функциональный язык программирования. Каждый макрос в нем есть детерминированная функция без побочных эффектов
    и в словах
    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Макрос легко отлаживается за счет его опять-же, "чистоты".
    Согласитесь, что ошибались, когда называли "каждый ОЛ макрос" "чистой функцией, детерминированной функцией, без побочных эффектов"?

    Цитата Сообщение от anthrwpos Посмотреть сообщение
    Поэтому я последний день и неохотно участвую в этой теме, потому что не хочу обсуждать определения чистоты из википедии непонятно на основании чего придуманные, а найти и предложить свой источник академической строгости не могу.
    Если не разбираетесь ("предложить свой источник академической строгости не могу"), то и не надо называть что попало "детерминированными функциями без побочных эффектов". Сейчас получается, что никакой источник привести не можете, и одновременно с этим настаиваете на своей правоте. Так не бывает.




    Если в макросе есть обратная связь или какой-нибудь функциональный блок (blink, sr-триггер), или write to FB, то этот макрос наверняка не является чистым.
    Разумеется, можно blink просто-напросто не подключить к выходам. Но, если blink как-то влияет на выходы, то, всё, макрос 100% недетерминирован. Если в макросе SR триггер влияет на выход и связан со входами макроса, то это 100% макрос с побочным эффектом.

    Да, чистые функции проще тестировать, но эта простота и возникает только для тех функций, которые не зависят от истории прошлых запусков.
    Функция "add :: Int -> Int -> Int" это чистая функция. Её протестировать несложно.

    А, если в макросе есть SR триггер, то тестировать такой макрос гораздо сложнее, т.к. нужно подавать разные истории входов, а этих историй потенциально очень большое количество. Историю какой длины нужно брать? 10 циклов? 100циклов? или, может 10000 циклов?
    Макрос с SR триггером не является чистой функцией, и тестировать его действительно сложнее.
    Последний раз редактировалось Владимир Ситников; 21.04.2017 в 19:50.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Это неважно. Важно то, что вызвали два раза с одинаковыми аргументами, а она, собака, вернула разные значения.
    Вы совершаете ошибку, заключая все такие функции в один ряд.
    Функции, обладающие предложенной мной чистотой в смысле развертки во времени они конечно-же не являются чистыми в смысле мгновенной детерминированности, однако они наследуют все преимущества чистых функций.
    Более того, я могу предложить чистую функцию следующего типа: sr_list :: [Bool] -> [Bool] -> [Bool], в которой последовательно идущие значения выходного списка меняются по правилам изменения состояния SR-триггера на основе значений входящих списков.
    И вы не сможете предложить никаких аргументов, чем функциональный блок SR в ОЛ хуже, чем данная функция за исключением того, что развертка во времени заменяется разверткой в памяти.
    Поэтому я настаиваю по меньшей мере не ставить такие функции в один ряд с методами ООП или функциями из Си, а сам я считаю их столь-же чистыми, пока не найду логичное обоснование того, почему так считать нельзя.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Сейчас получается, что никакой источник привести не можете, и одновременно с этим настаиваете на своей правоте. Так не бывает.
    Я не настаиваю на своей правоте. Я предполагаю, что моя идея разумна и лишь защищаю это предположение) Аксиоматические обоснования того, что это нечистая функция потому что это не называют чистой функцией меня не устраивают. Мне для того, чтобы убедить себя в обратном, нужны аргументы, почему плохая идея называть это чистой функцией.
    Да, чистые функции проще тестировать, но эта простота и возникает только для тех функций, которые не зависят от истории прошлых запусков.
    Функция "add :: Int -> Int -> Int" это чистая функция. Её протестировать несложно.
    функцию add_list :: [Int] -> [Int] -> [Int] тестировать ничем не сложнее, чем нечто, имеющее тип Int -> Int -> Int, в котором поведение зависит от истории запусков.
    Преимущество чистоты вовсе не в том, что сокращается пространство возможных состояний, а в том, что поведение чистой функции становится предсказуемым и не изменяется при использовании её в различных внешних условиях.
    Так то чистые функции могут иметь принципиально ничем не ограниченное множество возможных состояний с сколь угодно сложной структурой.

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя

Похожие темы

  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

Ваши права

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