수학에서 변수는 숫자를 넣을 수 있음을 의미하며 방정식은 여전히 참입니다.
root(square(x)) = abs(x)
프로그래밍 언어에서는 그렇지 않습니다. var가 변경 될 수 있습니다. 파이썬에서 :
y = (x**2)**.5
x *= 2
assert y == abs(x)
마지막 줄의 x가 같지 않기 때문에 예외가 발생합니다.
불변 변수를 사용하는 프로그래밍 언어가 있습니까?
수학에서 변수는 숫자를 넣을 수 있음을 의미하며 방정식은 여전히 참입니다.
root(square(x)) = abs(x)
프로그래밍 언어에서는 그렇지 않습니다. var가 변경 될 수 있습니다. 파이썬에서 :
y = (x**2)**.5
x *= 2
assert y == abs(x)
마지막 줄의 x가 같지 않기 때문에 예외가 발생합니다.
불변 변수를 사용하는 프로그래밍 언어가 있습니까?
답변:
제목 질문에 답하기 위해 "모든 프로그래밍 언어가 수학에서와 같이 변수를 사용합니까?": C, C #, Java, C ++ 및 기타 C 스타일 언어는 수학에서 사용되는 방식으로 변수를 사용합니다.
= 대신 ==를 사용해야합니다.
내가 네 원본을 가져 가면
root(square(x)) = abs(x)
그런 다음 구문 이외의 변경없이 직접 C #으로 변환 할 수 있습니다.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
x 제곱이 사용중인 데이터 유형의 최대 값보다 작은 경우 x의 모든 값에 대해 true로 평가됩니다. (자바는 비슷하지만 Math 네임 스페이스는 약간 다릅니다.)
이 다음 비트는 C #에서 컴파일에 실패합니다. 컴파일러는 한 연산의 반환을 다른 연산에 할당 할 수 없다는 것을 알기에 충분히 똑똑합니다.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
불변성은 이것과 아무 관련이 없습니다. 여전히 불변 언어로 값을 할당해야하며 주어진 언어가 =를 연산자로 사용하여이를 수행하도록 선택할 수 있습니다.
추가로 요점을 입증하면이 루프는 유효한 x 값을 소진하고 오버플로 예외가 발생할 때까지 실행됩니다
while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
{
++x;
System.Console.WriteLine(x);
}
이것이 수학자들이 과제에 =를 사용하는 것을 싫어하는 이유입니다. 혼동됩니다. 나는 이것이 당신을 혼란스럽게 만들었다 고 생각합니다. 예를 들어
y = (x**2)**.5
x *= 2
assert y == abs(x)
이것을 대수로 바꾸면 다음과 같이됩니다.
abs (2x) = 근 (x ^ 2)
물론 0 이외의 값에 대해서는 맞지 않습니다. 불변성은 원래 방정식의 왼쪽과 오른쪽을 평가하는 사이에 추가 단계를 추가 할 때 x 값을 변경하는 오류 만 방지합니다. 실제로 식을 평가하는 방법 은 바뀌지 않습니다 .
Haskell 과 같은 순수하게 기능적인 프로그래밍 언어는 불변 변수를 적용합니다. 변수 대신 식별자라고 부르고 싶습니다.
C, C ++ 및 Objective-C는 함수 (및 메소드) 인수뿐만 아니라 "const"유형 한정자를 사용하여 다른 변수 (식별자)에 대한 불변성을 지정할 수 있습니다.
클래스 업데이트 를 허용하지 않음으로써 파이썬에서도 불변성을 시뮬레이션 할 수 있습니다 . 앞에서 언급했듯이 대부분의 순수 기능 프로그래밍 언어는 불변성을 강화합니다. Clojure 는 최근 JVM 플랫폼에 추가되었습니다 (Clojure는 LISP 언어입니다).
에서는 스칼라 (또한 JVM의 언어) OO 및 FP 지원 변수를 하나로 선언 val
불변. 스칼라 표현력과 OO / FP 하이브리드 지원은 Mathematica와 유사 하게 보입니다 . ( Akka는 스칼라와 자바에 .. 같은 STM 등 얼랑 OTP와 Clojure의 기능을 추가하는 프레임 워크입니다.) LACASA는 스칼라에서 개체 능력 훈련을 시행하고, 고유의 객체 참조를 제공하기 위해 타입 시스템 및 프로그래밍 모델을 추가합니다. ( 코드 ) ( 이론적 배경 )
Java에서 선언 된 변수 final
는 변경할 수 없으며 Google Guava 와 같은 Java 라이브러리 에는 변경할 수없는 콜렉션 라이브러리가 포함됩니다. Java String
도 항상 불변입니다.