2013-03-27 1 views
2

저는 함수형 프로그래밍에서 새로운데 "불변"이라는 개념을 이해할 수 없습니다.
예를 들어, SML의 : SML의 원칙에 따라무엇이 "불변의 변수"는 함수형 프로그래밍을 의미합니다

val a = 3 
val a = a+1 

는, 마지막 줄은 변수 (A)의 "변화"값하지 않습니다,하지만이 누군가 나를 위해 그것을 설명해 수, 이제 4와 동일 ? "돌연변이 없음"의 이점은 무엇입니까?

+2

두 번째'a'는 이전 변수와 동일하게 호출되는 새로운 변수이므로 중첩 된 컨텍스트에서이를 마스크합니다. 컴파일러는이 코드를'let a000 = 3 in let a001 = a000 + 1 in ... '과 같은 것으로 다시 씁니다. –

+0

그래서 다른 메모리 위치를 참조한다는 의미입니까? 첫 번째 "a000"을 다시 찾을 수 있습니까? – nzomkxia

+1

"메모리 위치"와 같은 변수를 생각하지 않아야합니다 (어쨌든 상수이기 때문에 접힐 수 있습니다). 이름이 마스킹되었으므로 마스킹 정의 컨텍스트를 종료하지 않는 한 원본을 뒤로 가져올 수 없습니다. 'a = 1을 let b = (a의 a + 1은/* a는 2 * /가된다.)는/* b를 잊어서 원래의 a * /' –

답변

4

변수를 변경할 수 없다는 것은 자체 값을 변경할 수 없다는 의미입니다. 당신이

val a = 3 
val a = a+1 

거기 보여주는있는 것은 : a의 새로운 값이 단순히 a의 이전 값을 "그림자"입니다. a은 단지 3에 바인딩 된 이름이고 두 번째 줄에는 4에 바인딩 된 이름입니다. a의 이전 값이 여전히 존재하지만 액세스가 불가능합니다.

일종의 데이터 구조를 사용하는 경우 더 분명히 볼 수 있습니다. 다른 많은 언어에서 볼 수있는 것처럼 뮤 테이타 메소드가 없습니다. 예를 들어, 목록이 val L = [1,2,3] 인 경우 L의 첫 번째 값을 변경할 수있는 방법이 없습니다. L을 모두 섀도 잉하여 이전 목록을 섀도 잉하도록 새 목록을 작성해야합니다.

따라서 새 값 선언을 바인딩 할 때마다 현재의 모든 이름/값 바인딩을 사용하여 새 환경이 만들어집니다. 이러한 바인딩은 변경 될 수 없으며 간단히 숨겨져 있습니다.

관련 문제