순수한 기능에 관한 질문이 있습니다. Wikipedia 페이지에 따르면 순수한 기능을위한 필수 조건 중 하나는 다음과 같습니다.
결과의 평가는 변경 가능한 객체의 돌연변이 또는 I / O 장치로의 출력과 같이 의미 적으로 관찰 가능한 부작용 또는 출력을 유발하지 않습니다.
이것이 실제로 무엇을 의미합니까? 또는 의미 론적으로 관찰 할 수없는 부작용을 어떻게 만들 수 있습니까?
순수한 기능에 관한 질문이 있습니다. Wikipedia 페이지에 따르면 순수한 기능을위한 필수 조건 중 하나는 다음과 같습니다.
결과의 평가는 변경 가능한 객체의 돌연변이 또는 I / O 장치로의 출력과 같이 의미 적으로 관찰 가능한 부작용 또는 출력을 유발하지 않습니다.
이것이 실제로 무엇을 의미합니까? 또는 의미 론적으로 관찰 할 수없는 부작용을 어떻게 만들 수 있습니까?
답변:
프로그램의 의미는 과학적 모델과 마찬가지로 연구하고 싶지 않은 측면을 무시하는 동작의 모델입니다.
프로그램 실행에 대한 매우 상세한 모델은 실행 시간, 전력 소비, 전자기 방사 등을 포함하여 프로그램을 실행하는 컴퓨터의 물리적 동작을 모델링합니다. 이러한 측면은 거의 관련이 없기 때문에 거의 고려되지 않습니다. 그럼에도 불구하고 때로는 중요합니다. 비행기 자동 조종 장치의 유용한 모델에는 런타임 정보가 포함되어야하며 신용 카드 보안의 유용한 모델에는 전자기 방사선이 포함되어야합니다 ...
일반적인 의미론에서 타이밍 및 전력 소비와 같은 부작용은 무시됩니다. Haskell 인터프리터 프롬프트에서 표현식을 입력하는 평범한 설정에서도 결과 인쇄는 부작용입니다 (무한 객체를 인쇄하려고하면 문제가됩니다). Haskell 인터프리터에 메모리가 부족한 경우 "실제"모델에서 관찰 할 수있는 부작용이지만 무한한 계산을 효과적으로 수행하는 이상적인 Haskell 모델에는 없습니다.
관찰 부작용 의미에서 모델화 한 것이다. 일반적인 프로그래밍 언어 모델에서는 메모리 소비가 모델링되지 않으므로 PC에서 실행하려고해도 1TB의 스토리지가 필요한 계산은 순수 할 수 있습니다.
관찰 할 수없는 부작용의 또 다른 종류는 기능 내부에있는 것입니다. 이것은 관찰 할 수없는 부작용에 대해 이야기 할 때 대부분의 의미 론자들이 생각하는 것입니다. 내부적으로 가변 데이터를 사용하지만이 가변 데이터를 프로그램의 다른 부분과 공유하지 않는 계산을 고려하십시오. 예를 들어, 목록과 동일한 요소로 배열을 작성하고 배열을 제자리에 정렬 한 후 최종 순서대로 배열로 요소를 포함하는 목록을 리턴하는 목록 정렬 함수 :이 함수의 하위 표현식의 의미 론적 모델은 측면을 나타냅니다. 효과 (어레이 수정)이지만 함수 자체에는 외부 부작용이 없으므로 순수합니다.
보다 미묘한 예를 들어 일부 파일을 임시 파일에 쓰고 자체적으로 정리하는 함수를 고려하십시오. 항상 임시 파일을위한 충분한 공간이 있고 프로그램이 임시 파일을 공유하지 않는 의미론에서이 기능은 부작용이 없습니다. 임시 파일은 함수가 사용하는 추가 메모리 역할을합니다. 파일 시스템 전체 조건을 고려하는 의미론에서이 기능은 부작용이 있습니다. 외부 환경으로 인해 실패 할 수 있습니다. 기계가 충돌 할 수있게하는 의미론에서 기능은 부작용이 있습니다. 기능 실행 중 충돌이 발생하면 임시 파일이 남아있을 수 있습니다. 동시에 실행되는 프로그램이 임시 파일을보고 수정하도록하는 의미 체계에서이 기능은 부작용이 있습니다.