이것이 자격이되는지 표준 ML과 같은 기능적 언어에서는 기본적으로 모든 것이 변경되지 않습니다. 돌연변이는 일반적인 오류 ref
유형을 통해 지원됩니다 . 따라서 int
변수는 변경할 수 없으며 ref int
변수는 int
s 의 변경 가능한 컨테이너입니다 . 기본적으로 변수는 수학적 의미 (알 수 없지만 고정 된 값)의 실제 변수이고 ref
s는 명령형 프로그래밍 의미의 "변수"입니다. 즉, 읽고 쓸 수있는 메모리 셀입니다. (나는 그것들을 어사 인 이라고 부릅니다 .)
나는 문제 const
가 두 가지 라고 생각한다 . 첫째, C ++에는 가비지 콜렉션이 없기 때문에 사소한 영속적 인 데이터 구조 가 필요합니다 . const
있어야 아직 불가능하다 ++ C에서 완전 불변의 값을 갖는 어떤 의미가 깊은합니다.
둘째, C ++ const
에서는 옵트 아웃하지 않고 옵트 인해야합니다. 그러나 const
무언가 를 잊어 버렸다가 나중에 고치면 @RobY의 답변에 언급 된 "const poisoning"상황 const
이 발생하여 코드 전체에서 변경 사항이 연속적으로 발생합니다. const
기본값 인 경우 const
소급 적용되지 않습니다. 또한, const
모든 곳에 추가해야 코드에 많은 노이즈가 추가됩니다.
필자가 따르는 주류 언어 (예 : Java)는 C와 C ++의 성공과 사고 방식에 따라 크게 형성되었다고 생각합니다. 가비지 수집에서도 대부분의 언어 수집 API는 변경 가능한 데이터 구조를 가정합니다. 모든 것이 변경 가능하고 불변성이라는 사실이 코너 케이스로 간주된다는 사실은 인기있는 언어의 근본적인 사고 방식에 대해 많은 것을 말해줍니다.
편집 : greenoldman의 의견을 반영한 후 나는 const
데이터의 불변성에 대해 직접적인 것이 아니라는 것을 깨달았습니다 . const
메소드에 인스턴스에 부작용이 있는지 여부를 메소드 유형으로 인코딩합니다.
돌연변이를 사용하여 참조 적으로 투명한 동작 을 수행 할 수 있습니다. 호출 될 때 다른 값을 연속적으로 반환하는 함수 (예 :에서 단일 문자를 읽는 함수)가 있다고 가정합니다 stdin
. 캐시 / 메모리를 사용하여이 함수의 결과를 참조하여 투명한 값의 스트림을 생성 할 수 있습니다. 스트림은 값을 처음 검색하려고 시도 할 때 노드가 함수를 호출 한 다음 결과를 캐시하는 링크 된 목록입니다. 따라서 stdin
constains Hello, world!
이면 첫 번째 노드의 값을 처음 검색하려고 할 때 하나를 읽고 char
를 반환 H
합니다. 이후에는을 (를) H
호출하기위한 추가 호출없이 계속해서 돌아옵니다 char
. 마찬가지로, 두 번째 노드는 읽기 것이다 char
로부터stdin
처음으로 값을 검색하려고하면 이번에는 e
해당 결과를 리턴 하고 캐싱합니다.
여기서 흥미로운 점은 본질적으로 상태가 좋은 프로세스를 상태가없는 것으로 보이는 객체로 바꾸 었다는 것입니다. 그러나이를 달성하기 위해 객체의 내부 상태를 변경해야 (결과를 캐싱하여) 변이가 양성 이었습니다 . CharStream
const
스트림 이 불변 값처럼 동작 하더라도 우리를 만드는 것은 불가능 합니다. 이제 메소드 Stream
와 인터페이스가 const
있고 모든 함수가 기대 한다고 상상해보십시오 const Streams
. 귀하는 CharStream
인터페이스를 구현할 수 없습니다!
( 편집 2 : 분명히 우리가 부정 행위mutable
를 할 수CharStream
const
있는 C ++ 키워드 가 있습니다. 그러나이 허점은 const
보증을 파괴 const
합니다. 이제 그 방법을 통해 무언가가 돌연변이되지 않을 것이라고 확신 할 수는 없습니다 . 허점을 명시 적으로 요청해야하기 때문에 나쁘지만 여전히 명예 시스템에 전적으로 의존하고 있습니다.)
둘째, 고차 함수가 있다고 가정합니다. 즉, 함수를 인수로 다른 함수에 전달할 수 있습니다. const
ness는 함수 시그니처의 일부이므로 함수가 아닌 const
함수에 함수가 아닌 함수를 인수로 전달할 수 없습니다 const
. const
여기서 맹목적으로 시행 하면 일반성이 상실 될 수 있습니다.
마지막으로, const
객체를 조작 한다고해서 등 뒤의 외부 (정적 또는 전역) 상태 const
가 변경되지 않는다는 보장은 없으므로 '보증은 처음에 나타나는 것만 큼 강력하지 않습니다.
부작용의 유무를 타입 시스템에 인코딩하는 것이 보편적으로 좋은 것이라는 것은 분명하지 않습니다.