2009-03-04 5 views
3

참고 :는 "순수"기능에 의해, 내가
내가순수 함수가 전역 상태를 읽을 수 있습니까?

기능은 일부 글로벌 상태를 "읽고"경우 this 말하는 겁니다, 즉 자동으로 불순 렌더링 않습니다 "가상 순수"의미하지 않는다? 또는 다른 요인에 의존 하는가?

자동으로 불투명하게 렌더링되는 경우 이유를 설명하십시오.

다른 요인에 따라 다르면 설명해주십시오.

+0

왜 아래쪽 투표 ?? – hasen

답변

7

"순수한"함수는 입력 인수에 만있는 함수입니다. 그것이 다른 것을 읽으면, 그것은 순수한 함수가 아닙니다.

0

순수한 함수를 생성하려면 순수 함수가 필요합니다. 상수 표현은 정의에 의해 순수합니다.

글로벌 '상태'가 변경되지 않으면 괜찮습니다.

또한 referential transparency 참조 :

더 미묘한 예는 그 결과를 산출하기 위해 전역 변수 (또는 동적 범위 변수 또는 어휘 폐쇄)를 사용하는 함수의 그 것이다. 이 변수는 매개 변수로 전달되지 않지만 변경 될 수 있기 때문에 매개 변수가 동일해도 함수에 대한 후속 호출의 결과가 다를 수 있습니다. 순수 함수형 프로그래밍에서는 파괴적인 할당이 허용되지 않으므로 전역 변수 또는 동적 범위 변수를 사용하는 함수는 변경 될 수 없으므로 참조가 투명합니다.

3

특정 특수한 경우에는 yes입니다. 예를 들어 함수에 의해 읽고 쓰여지는 이미 계산 된 값의 전역 캐시가있는 경우 수학적으로 순수하지만 결과는 입력에만 의존하지만 순수하지는 않습니다 가장 엄격한 의미에서. 예를 들어이 경우

static int cache[256] = {0}; 
int compute_something(uint8_t input) 
{ 
    if(cache[input] == 0) 
     cache[input] = (perform expensive computation on input that won't return 0); 
    return cache[input]; 
} 

, 너무 오래 다른 기능은 글로벌 cache을 접촉하지 않기 때문에, 그것은 기술적으로 외부 세계 상태에 따라 달라에도 불구하고, 여전히 수학적으로 순수 기능입니다. 그러나이 상태는 단지 성능 최적화에 불과합니다. 성능이 최적화되지 않은 상태에서도 동일한 계산을 수행 할 수 있습니다.

+0

어, 그런 함수에서 "같은 입력, 다른 출력"을 얻을 수는 없을 것입니다. 예를 들어 비트 플립 핑 (Bit Flipping)은 불리언 값의 캐쉬를 읽고 거기에있는 것의 반대를 반환하고 동시에 그것을 뒤집습니다. 그런 다음 함수가 동일한 "입력"을 사용하여 실행되면 다른 출력을 얻게됩니다 (함수의 과거 사용법에 따라 다름). 그 기능은 순수 할 수 없습니다. –

0

예를 들어, 하스켈에서는 불순한 부분에 무작위 숫자의 무작위 목록을 만들고 그 목록을 순수한 함수에 전달할 수 있습니다. 구현은 순수 함수가 필요할 때만 사용하는 다음 숫자를 생성하지만 함수는 여전히 순수합니다.

관련 문제