프로세스 메모리에서 정확하게 읽기 작업을하는 것은 무엇입니까? 전역 메모리에 정수 100 개의 배열을 만든 다음이 배열의 42 번째 요소를 가져 갔다고 가정합니다. 부작용이 아닙니까? 그렇다면 왜 파일에서 100 개의 정수로 된 같은 배열을 읽는 것이 부작용입니까?
프로세스 메모리에서 정확하게 읽기 작업을하는 것은 무엇입니까? 전역 메모리에 정수 100 개의 배열을 만든 다음이 배열의 42 번째 요소를 가져 갔다고 가정합니다. 부작용이 아닙니까? 그렇다면 왜 파일에서 100 개의 정수로 된 같은 배열을 읽는 것이 부작용입니까?
답변:
액세스하는 메모리가 변경 될 수 있으면 실제로 부작용입니다.
예를 들어, Haskell에서 가변 배열 ( IOArray
) 에 액세스하는 함수의 유형은 다음과 같습니다.
Ix i => IOArray i e -> i -> IO e
(우리의 목적을 위해 약간 단순화). 불변 배열에 액세스하는 동안 유형이 있습니다
Ix i => Array i e -> i -> e
첫 번째 버전 IO e
은 I / O 부작용이있는 유형의 무언가를 반환합니다 . 두 번째 버전은 e
부작용없이 유형의 요소를 반환합니다 .
파일에 액세스하는 경우 프로그램 실행 중에 파일이 변경되는지 컴파일 타임에 알 수 없습니다. 따라서 항상 부작용이있는 작업으로 취급해야합니다.
컴퓨터 과학에서, 함수 또는 표현식은 값을 반환하는 것 외에도 일부 상태를 수정하거나 호출 함수 또는 외부 세계와 관찰 가능한 상호 작용을 갖는 경우 부작용이 있다고합니다. 파일에서 읽는 것은 외부 세계와의 관찰 가능한 상호 작용입니다. 부작용의 정의를 충족시킵니다. 배열이 수정 될 수있는 다른 함수와 관찰 가능한 상호 작용이기 때문에 배열이 상수가 아니면 전역 메모리에서 42 번째 요소를 읽는 것도 부작용이됩니다.
메모리에서 읽는 것은 다른 기능에 영향을 미치지 않으므로 부작용이 없습니다. 파일을 읽으면 일반적으로 파일의 위치 포인터가 이동하므로 다시 읽을 때 이미 읽은 내용을 읽은 후에 한 읽기 기능이 다른 읽기 기능의 결과를 변경하므로 부작용이 발생합니다. 대신에이 부작용이 사라지는 것보다 한 번에 파일을 읽고 닫으면 큰 파일에는 적용 할 수 없습니다. 또한 파일을 여는 방법에 따라 파일을 연 후 파일이 잠길 수 있으므로 파일 열기 및 읽기의 첫 번째 시도는 성공하지만 다음 시도는 파일 이미 열려 있음 오류 와 함께 실패하며 이는 부작용입니다.
한 번에 파일을 읽고 동시에 여러 번 읽을 수있는 부작용없는 읽기 기능을 만드는 것은 읽기 기능의 영향을받는 파일 쓰기 기능이 있고 파일 쓰기 기능을 다시 제거 할 수 없기 때문에 어렵습니다. .
IO
모나드 를 통해 파일에서 시퀀스 돌연변이 작업을 수행 할 수있는 경우에만 ) 읽기를 위해 부작용없이 기능을 만들 수 있습니다.