Today ()는 결과가 사용자가 제공하지 않은 것에 의존하기 때문에 불순한 함수입니다. 특히 현재 시스템 시간입니다. 따라서 호출시 제공된 입력만을 기반으로 할 때 결과가 결정적이지 않습니다.
순수한 기능은입니다 int Add(int a, int b) {return a + b;}
. 이 함수는 주어진 것만으로 작동하며 다른 외부 상태 데이터를 사용하지 않습니다. 이것의 자연스러운 결과는 Add(2,2)
지금부터 끝까지 4를 얻을 수 있다는 것 입니다. 또한 함수가 외부 상태를 변경 하지 않기 때문에 ( "부작용"이 없음) 지금부터 끝까지 2와 2를 추가하는 Add ()는 시스템에서 다른 것을 변경하지 않습니다. 함수의 결과를 변수에 할당하거나 값을 사용하여 상태를 업데이트하십시오 (함수 자체가 수행하는 작업이 아님). 사실상 모든 고전적인 수학적 연산은 순수한 함수이며 그대로 구현 될 수 있습니다.
반면에 today () 는 연속으로 두 번 호출 될 때 동일한 값을 생성 할 수 있지만 며칠 동안 반복해서 호출되는 경우에는 그렇지 않습니다. 이는 함수에 매개 변수로 제공하지 않은 외부 상태 데이터에 의존하기 때문입니다. 결과적으로 프로그램 경계 내에서 Today () 함수의 결과를 제어하는 것은 불가능합니다. 특정 날짜에 지정된 값을 생성하며, 실행되는 컴퓨터의 시스템 시계를 변경하지 않는 한 (일반적으로 프로그램 경계 밖에서 발생하는 변경) 다른 날에는 해당 값을 생성하지 않습니다.
불완전한 기능이 반드시 나쁜 것은 아닙니다. 데이터 저장소, 통신 파이프 라인, UI 디스플레이, 주변 장치 등과 같이 프로그램 경계 외부의 모든 항목과 상호 작용하려면 기능적 언어에서도 불순한 기능이 필요합니다. 이러한 작업을 수행하지 않는 프로그램은 프로그램입니다. 그것은 그 유용성에 급격히 제한되어있다. 나는 심지어 그러한 프로그램을 사소한 것으로 부르기까지했다. 입력을 받아 들일 수단이나 출력을 알려주는 수단이 없다면 아무것도하지 않을 수도 있기 때문이다. 기능 언어로 작성된 프로그램은 런타임에서 제공 한 입력 만 가질 수 있으며 명시 적으로 정의 된 불완전한 메소드없이 런타임에보고 된 출력을 생성 할 수 있습니다. 그러나 런타임은 불완전한 컴퓨터 시스템 내에서 작업하는 모든 불완전한 세부 사항을 추상화하기 때문입니다.
사용하는 기능이 순수하고 어떤 기능이 아닌지 아는 것은 매우 좋은 일이므로 사용 방법에 대한 올바른 결정을 내릴 수 있습니다. 불완전한 기능은 기능을 수행하거나 용도에서 명확하지 않은 기능에 의존하기 때문에 사용법에 대한 지식만으로는 예측할 수없는 동작을 수행 할 수 있습니다. 기능을 사용하는 시스템을 일관된 상태로 배치하여 결정적인 결과를 기대하려면 기능의 목적과 외부 상태에 필요한 기능 및 외부 상태에 대한 추가 지식이 필요합니다.