대체 모델을 참조하면 (참조 투명도 (RT)) 함수를 가장 간단한 부분으로 분해 할 수 있습니다. 표현식이 RT 인 경우 표현식을 분해하고 항상 동일한 결과를 얻을 수 있습니다.
그렇습니다. 직관이 아주 옳습니다. 보다 정확한 정보를 얻으려면 다음과 같이하십시오.
말했듯이 모든 RT 표현식에는 single"결과" 가 있어야합니다 . 즉, factorial(5)프로그램에 표현이 주어지면 항상 동일한 "결과"를 산출해야합니다. 따라서 특정 factorial(5)프로그램이 프로그램에 있고 120을 산출하면 시간에 관계없이 확장 / 계산 된 "단계 순서"에 관계없이 항상 120을 산출해야합니다 .
예 : factorial기능.
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
이 설명에는 몇 가지 고려 사항이 있습니다.
우선, 다른 평가 모델 (적용 대 정상 순서 참조)은 동일한 RT 표현에 대해 다른 "결과"를 산출 할 수 있습니다.
def first(y, z):
return y
def second(x):
return second(x)
first(2, second(3)) # result depends on eval. model
위의 코드에서, first그리고 second정상 순서 및 실용적 순서에 따라 평가 referentially 경우 투명하고, 또, 마지막 표현식이 다른 "결과"산출 (후자 하에서 발현은 정지되지 않음).
.... 따옴표로 "결과"를 사용합니다. 식을 중지 할 필요가 없으므로 값이 생성되지 않을 수 있습니다. 따라서 "결과"를 사용하는 것은 흐릿합니다. computations평가 모델 하에서 RT 표현식이 항상 동일하다고 말할 수 있습니다 .
셋째, foo(50)다른 위치에서 다른 표현으로 프로그램에 두 가지가 나타나는 것을 볼 필요가있을 수 있습니다 . 각각 서로 다른 결과를 얻을 수 있습니다. 예를 들어, 언어가 동적 범위를 허용하면 어휘 적으로 동일하지만 두 표현식이 다릅니다. 펄에서 :
sub foo {
my $x = shift;
return $x + $y; # y is dynamic scope var
}
sub a {
local $y = 10;
return &foo(50); # expanded to 60
}
sub b {
local $y = 20;
return &foo(50); # expanded to 70
}
동적 범위 오도 그것이 쉬운 일이 생각 할 수 있도록하기 때문에이 x유일한 입력 foo현실에서,이 때, x하고 y. 차이점을 보는 한 가지 방법은 프로그램을 동적 범위가없는 동등한 것으로 변환하는 것입니다. 즉, 매개 변수를 명시 적으로 전달하는 대신 정의하는 대신 호출자에서 명시 적으로 foo(x)정의 foo(x, y)하고 전달 y합니다.
요점은, 우리는 항상 function사고 방식에있다 : 표현에 대한 특정 입력이 주어지면, 상응하는 "결과"가 주어진다. 동일한 입력을 주면 항상 동일한 "결과"를 기대해야합니다.
이제 다음 코드는 어떻습니까?
def foo():
global y
y = y + 1
return y
y = 10
foo() # yields 11
foo() # yields 12
foo재정의가 있기 때문에 절차는 RT를 나누기. 즉, 우리 y는 한 지점에서 정의하고 나중에는 동일하게 재정의했습니다 y. 위의 perl 예제에서 ys는 서로 다른 바인딩이지만 동일한 문자 이름 "y"를 공유합니다. 여기서 ys는 실제로 동일합니다. 이것이 우리가 (재) 할당이 메타 작업 이라고 말하는 이유 입니다. 실제로 프로그램의 정의를 변경하고 있습니다.
대략 사람들은 일반적으로 다음과 같이 차이점을 묘사합니다. 부작용이없는 환경에서는의 매핑이 있습니다 input -> output. "제 국적"설정에서는 시간에 따라 변경 될 수 input -> ouput있는 컨텍스트 state가 있습니다.
이제는 해당 값을 표현식으로 대체하는 대신, state각 연산마다 변환을 적용 해야합니다 (물론 state계산을 수행하기 위해 표현식을 참조 할 수도 있음 ).
따라서 부작용이없는 프로그램에서 식을 계산하기 위해 알아야 할 모든 것이 입력일 경우, 명령형 프로그램에서 각 계산 단계에 대한 입력과 전체 상태를 알아야합니다. 추론은 처음으로 큰 타격을 입었습니다 (문제가있는 절차를 디버그하려면 입력 및 코어 덤프 가 필요함 ). 메모와 같은 특정 트릭은 실용적이지 않습니다. 그러나 동시성과 병렬 처리는 훨씬 더 어려워집니다.
RT사용에서 비활성화 당신을substitution model.에 큰 문제가 없다 (가) 사용 할 수있는substitution model프로그램에 대한 이유에 그것을 사용의 힘을?