Что именно делает чтение из памяти процесса чистой операцией? Предположим, я создал массив из 100 целых чисел в глобальной памяти, а затем взял 42-й элемент этого массива. Это не побочный эффект, верно? Так почему же чтение того же массива из 100 целых чисел из файла является побочным эффектом?
functional-programming
side-effect
ZhekaKozlov
источник
источник
Ответы:
Если память, к которой вы обращаетесь, может измениться, то это действительно побочный эффект.
Например, в Haskell функция доступа к изменяемым массивам (
IOArray
) имеет тип(немного упрощенно для наших целей). При доступе к неизменяемому массиву есть тип
Первая версия возвращает что-то типа,
IO e
что означает, что она имеет побочные эффекты ввода / вывода. Вторая версия просто возвращает элемент типаe
без каких-либо побочных эффектов.В случае доступа к файлу, вы просто не можете знать во время компиляции, будет ли файл когда-либо изменяться во время выполнения программы. Поэтому вы всегда должны рассматривать это как операцию с потенциальными побочными эффектами.
источник
В информатике функция или выражение, как говорят, имеют побочный эффект, если, помимо возврата значения, они также изменяют некоторое состояние или имеют наблюдаемое взаимодействие с вызывающими функциями или внешним миром. Чтение из файла - это наблюдаемое взаимодействие с внешним миром. Это соответствует определению побочного эффекта. Чтение 42-го элемента из глобальной памяти также будет побочным эффектом, если только ваш массив не является константой, поскольку это будет наблюдаемое взаимодействие с другими функциями, которые могут изменять массив.
источник
Если у вас есть дескриптор общего файла, то чтение файла переместит этот дескриптор файла в положение, в котором вы его прочитали, и оставит его в этой позиции.
Если у вас есть два потока с отдельными файловыми дескрипторами к одному и тому же файлу, чтение из одного не будет иметь заметных побочных эффектов для другого.
Однако в обоих случаях при чтении из памяти и при чтении файлов может быть скрытый побочный эффект кэширования операторской системы.
источник
Чтение из памяти не влияет на другие функции и, следовательно, не имеет побочных эффектов. При чтении из файла обычно перемещается указатель позиции файла, поэтому при повторном чтении вы читаете данные после того, что уже прочитали, поэтому одна функция чтения изменяет результат других функций чтения, что является побочным эффектом. Если вместо этого вы открываете, читаете и закрываете файл за один раз, этот побочный эффект исчезает, но это невозможно для больших файлов. Кроме того, в зависимости от того, как вы открываете файл, он может заблокироваться после его открытия, поэтому первая попытка открыть и прочитать файл будет успешной, в то время как при следующих попытках произойдет сбой с ошибкой открытия файла , что снова является побочным эффектом.
Трудно создать функцию чтения без побочных эффектов, которая считывает файл за один раз и позволяет выполнять несколько операций чтения одновременно, поскольку существуют функции записи в файл, на которые влияет функция чтения, а избавление от функций записи в файл снова невозможно ,
источник
IO
монаду?), Вы можете сделать функцию чтения без побочных эффектов.Чтение из потока уже является побочным эффектом, потому что результат функций, таких как,
isEOF
может возвращать другой результат после чтения, чем до чтения.источник