수학에서와 같이 프로그래밍 언어에서 변수를 사용합니까?


11

수학에서 변수는 숫자를 넣을 수 있음을 의미하며 방정식은 여전히 ​​참입니다.

root(square(x)) = abs(x)

프로그래밍 언어에서는 그렇지 않습니다. var가 변경 될 수 있습니다. 파이썬에서 :

y = (x**2)**.5
x *= 2
assert y == abs(x)

마지막 줄의 x가 같지 않기 때문에 예외가 발생합니다.

불변 변수를 사용하는 프로그래밍 언어가 있습니까?


5
수학에서 대부분의 방정식은 동일성이 아닙니다. 예를 들어, x ^ 2 + 5 = 6x는 x = 1 또는 x = 5 인 경우에만 유효합니다. 일부 "우주"의 모든 값 (예 : 모든 실수의 집합)에 유효한 방정식 (예 : sin ( 2x) = 2 sin x cos x를 identities 라고 합니다.
Andreas Rejbrand

4
수학 변수! = 프로그래밍 언어 변수. 수학에서 변수에 대한 선입견을 프로그래밍에 도입 할 때 많은 사람들이 혼란스러워서 항상 다른 이름을 가져야한다고 생각했습니다.
Lie Ryan

1
수학에서 변수의 목표는 프로그래밍에서와 같지 않다고 생각합니다. 수학에서 변수는 알 수없는 알 수없는 값 또는 결과를 얻기 위해 값을 넣는 수식의 위치를 ​​나타냅니다. 일반적인 프로그래밍 언어의 경우 두 번째 경우 만 의미가 있습니다. 첫 번째 경우 Mathematica와 같은 소프트웨어가 필요합니다.
Pagotti

아닙니다. "x = 5"에 숫자를 입력 하십시오 .

답변:


6

제목 질문에 답하기 위해 "모든 프로그래밍 언어가 수학에서와 같이 변수를 사용합니까?": 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 값을 변경하는 오류 만 방지합니다. 실제로 식을 평가하는 방법 은 바뀌지 않습니다 .


24

Haskell 과 같은 순수하게 기능적인 프로그래밍 언어는 불변 변수를 적용합니다. 변수 대신 식별자라고 부르고 싶습니다.


3
불완전한 기능 언어 인 Erlang에서는 변수도 변경할 수 없습니다.
sepp2k

얼랭이 너무 몰라 그것들이 원자입니까? Erlang은 모든 종류의 가변 가변 스토리지를 허용합니까?
Ionuț G. Stan

3
@Ionut : 아닙니다. Erlang 원자는 lisp와 ruby에서 상징이라고합니다. 두 번째 질문과 관련하여 : 전역 (well, 프로세스 당) 가변 가변 해시 맵 인 프로세스 사전이 있습니다. 그러나 그것은 내 경험에서 거의 사용되지 않습니다. 참조 투명성을 깨는 유일한 방법은 메시지 전달입니다.
sepp2k

4
흠, 나 자신에게 Erlang :)
Ionuț G. Stan

이것은 질문에 어떻게 대답합니까?
gnat

5

=프로그래밍 언어에서 사용되는 기호는 잘못된 것입니다. <-즉, "store"또는 COBOL을 MOVE사용해야합니다.

또한 Prolog는 math와 같은 변수를 사용합니다. 변수는 변경할 수 없으며 Prolog 엔진은 변수가 채워져 솔루션이 있는지 확인합니다.

또한 Curry는 Haskell과 Prolog가 혼합되어 있습니다.


3

C, C ++ 및 Objective-C는 함수 (및 메소드) 인수뿐만 아니라 "const"유형 한정자를 사용하여 다른 변수 (식별자)에 대한 불변성을 지정할 수 있습니다.


3

클래스 업데이트허용하지 않음으로써 파이썬에서도 불변성을 시뮬레이션 할 수 있습니다 . 앞에서 언급했듯이 대부분의 순수 기능 프로그래밍 언어는 불변성을 강화합니다. Clojure 는 최근 JVM 플랫폼에 추가되었습니다 (Clojure는 LISP 언어입니다).

에서는 스칼라 (또한 JVM의 언어) OO 및 FP 지원 변수를 하나로 선언 val불변. 스칼라 표현력과 OO / FP 하이브리드 지원은 Mathematica와 유사 하게 보입니다 . ( Akka는 스칼라와 자바에 .. 같은 STM 등 얼랑 OTP와 Clojure의 기능을 추가하는 프레임 워크입니다.) LACASA는 스칼라에서 개체 능력 훈련을 시행하고, 고유의 객체 참조를 제공하기 위해 타입 시스템 및 프로그래밍 모델을 추가합니다. ( 코드 ) ( 이론적 배경 )

Java에서 선언 된 변수 final는 변경할 수 없으며 Google Guava 와 같은 Java 라이브러리 에는 변경할 수없는 콜렉션 라이브러리가 포함됩니다. Java String도 항상 불변입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.