불변성

Q#의 모든 형식은 값 형식입니다. Q#에는 참조 또는 포인터의 개념이 없습니다. 대신 set 문을 통해 새 값을 이전에 선언된 변수에 재할당할 수 있습니다. 예를 들어 Int 형식의 변수 또는 Int[] 형식의 변수에 대한 재할당 간의 동작에는 차이가 없습니다. 다음과 같은 명령문 시퀀스를 고려해 보세요.

    mutable arr1 = new Int[3];
    let arr2 = arr1; 
    set arr1 w/= 0 <- 3; 

첫 번째 명령문은 정수의 새 배열([0,0,0])을 인스턴스화하여 이를 arr1에 할당합니다. 다음 명령문은 해당 값을 arr2라는 이름의 변수에 할당합니다. 마지막 명령문은 3으로 설정된 인덱스 0의 값을 제외하고 동일한 값을 사용하여 arr1을 기반으로 하는 새 배열 인스턴스를 만듭니다. 그러면 새로 만든 배열이 arr1 변수에 할당됩니다. 마지막 줄은 평가 및 재할당 문에 대해 축약된 구문을 사용하며, 마찬가지로 set arr1 = arr1 w/ 0 <- 1;으로 작성되었을 수 있습니다.
세 개의 문을 실행한 후에는 arr1[3,0,0] 값이 포함되고, arr2는 변경되지 않은 상태로 유지되며 [0,0,0]을 포함합니다.

따라서 Q#은 핸들의 변경 가능성과 형식의 동작을 명확하게 구분합니다. Q# 내의 변경 가능성은 형식이나 값이 아닌 기호에 적용되는 개념입니다. 값 자체가 아니라 값에 액세스할 수 있도록 하는 핸들에 적용됩니다. 형식 시스템에서 암시적 또는 명시적으로 표현되지 않습니다.

물론 이는 공식적으로 정의된 동작에 대한 설명일 뿐입니다. 내부적으로 실제 구현은 참조 계산 체계를 사용하여 메모리를 최대한 많이 복사하지 않도록 합니다. 특정 값에 액세스하는 현재 유효한 하나의 핸들만 있는 한 수정이 구체적으로 현재 위치에서 수행됩니다.