대체 모델을 참조하면 (참조 투명도 (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 예제에서 y
s는 서로 다른 바인딩이지만 동일한 문자 이름 "y"를 공유합니다. 여기서 y
s는 실제로 동일합니다. 이것이 우리가 (재) 할당이 메타 작업 이라고 말하는 이유 입니다. 실제로 프로그램의 정의를 변경하고 있습니다.
대략 사람들은 일반적으로 다음과 같이 차이점을 묘사합니다. 부작용이없는 환경에서는의 매핑이 있습니다 input -> output
. "제 국적"설정에서는 시간에 따라 변경 될 수 input -> ouput
있는 컨텍스트 state
가 있습니다.
이제는 해당 값을 표현식으로 대체하는 대신, state
각 연산마다 변환을 적용 해야합니다 (물론 state
계산을 수행하기 위해 표현식을 참조 할 수도 있음 ).
따라서 부작용이없는 프로그램에서 식을 계산하기 위해 알아야 할 모든 것이 입력일 경우, 명령형 프로그램에서 각 계산 단계에 대한 입력과 전체 상태를 알아야합니다. 추론은 처음으로 큰 타격을 입었습니다 (문제가있는 절차를 디버그하려면 입력 및 코어 덤프 가 필요함 ). 메모와 같은 특정 트릭은 실용적이지 않습니다. 그러나 동시성과 병렬 처리는 훨씬 더 어려워집니다.
RT
사용에서 비활성화 당신을substitution model.
에 큰 문제가 없다 (가) 사용 할 수있는substitution model
프로그램에 대한 이유에 그것을 사용의 힘을?