Pull to refresh

Comments 16

Чистые функции, хороши тем, что их можно вычислять в любом порядке(или вообще не вычислять, если не надо). Ваши же «детерминированные фунции» требуют строгого и последовательного вычисления, иначе в консоли вместо «Hello, world!» появится «world! Hello,» или вообще «world!».
То есть, любая чистая функция ассоциативна?
Меня, видимо, неправильно поняли. Я говорю, что если у нас есть несколько вызовов чистых функций, то их можно выполнить в любом порядке, т.е., например, при вычислении
SomeFunction(Clean1(arg1), Clean2(arg2), Clean3(arg3));

Если функции Clean1..3 чистые, ты мы сначала можем вычислить Clean2(arg2), потом Clean3(arg3), а Clean1(arg1) вообще не вычислять, т.к. в SomeFunction это значение не понадобилось. А если Clean1..3 печатают что-то в консоль, то может получиться «world! Hello,».
UFO just landed and posted this here
Скорее, коммутативна.
По мере возможности пвытаюсь делать функции чистыми, однако это не всегда возможно, должны же быть функции, клоторые выводят данные в какой-то поток, или берут их из него. По мпте.матическому определению функия никак не взаимодействует с внешним миром. Все остальные «функции», насколько я знаю, называются процедураами.

Но я ттак и не понял почему автор ошибался, разьве что не совсем точно дал опре, деление.
Ссори за опечатки, впервые пишу с сесорной клавиатуры.
Я не пишу это в личку, потому что следующее утверждение — вопрос на обсуждение.

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


В оригинале звучит так: «Детерминированные фунуции также могут не использовать внешнее состояние, т.к. это может влиять на их выполнение. Но большинство определений детерминированных функций просто утверждает, что вы можете определить их результат на основе входных данных».
То есть, по определению, детерминированная функция может сколько угодно использовать состояние, если оно не влияет на возвращаемый результат. В переводе же детерминированная функция фактически приравнивается к чистой.
Функция вывода на консоль не будет детерминированной. Взять к примеру случай, когда консоль вдруг становится недоступна (а такое бывает, если например это какое-то терминальное устройство) и мы получаем исключение. В случае «нечистых» функций таких «если», может быть порядочно, чтобы с уверенностью заявить, что функции не являются детерминированными.
В соответствии с подобными рассуждениями ни одна функция не может считаться детерминированной, поскольку всегда есть вероятность того, что закончится память или сыграют роль еще какие-нибудь внешние по отношению к функции факторы. Дело в том, что понятие «чистота» относится к функции как к программной реализации алгоритма, а понятие детерминированности к самому алгоритму.
«Подвизоки»… Подвысоцкий же!
Здесь он сам себя представляет, можете ознакомиться.
А мне вот не совсем понятно, как быть с логированием. С одной стороны -= оно что-то куда-то пишет. А с другой — никак не влияет на логику работы системы. Я, конечно, понимаю что бага в коде логирования может вызвать падение всей системы, но то же самое можно сказать о любом методе, который мы вызываем.
Подозреваю что функция с журналированием — детерминированная, но не чистая. Чистая функция — это нечто вроде чёрного ящика — вход-выход и ничего более.
Sign up to leave a comment.

Articles