난 변경할 수 info
필요 실현 코드OCaml의 분산
module type TS = sig
type +'a t
end
module T : TS = struct
type 'a t = {info : 'a list}
end
이 조각을 작성하면과 불변 (a, -'a를 '+).
난 후, 작성 :module type TS = sig
type +'a t
end
module T : TS = struct
type 'a t = {mutable info : 'a list}
end
그러나, 놀람,
Type declarations do not match:
type 'a t = { mutable info : 'a list; }
is not included in
type +'a t
Their variances do not agree.
아, 내가 약 분산 청각 기억. 공분산 및 반공에 관한 내용이었습니다. 나는 용감한 사람이고, 내 문제 만 혼자 발견 할 것이다!
두 흥미로운 기사 (here 및 here)를 발견했으며 이해했습니다.
나는
module type TS = sig
type (-'a, +'b) t
end
module T : TS = struct
type ('a, 'b) t = 'a -> 'b
end
을 쓸 수 있습니다하지만 궁금하네요. 어떻게 변경 가능한 데이터 유형은 불변이고 단지 공변수가 아닐까요?
내 목록이 바뀔 수 없으므로 'A list
은 ('A | 'B) list
의 하위 유형으로 간주 될 수 있음을 이해합니다. 함수에 대해 똑같은 함수가있는 경우, 형식이 'A | 'B -> 'C
인 경우 'A -> 'C | 'D
함수의 하위 유형으로 간주 될 수 있습니다. 내 함수가 'A
및 'B
을 처리 할 수있는 경우에만 'A
을 처리 할 수 있고 반환 만하면 'C
님께서는 'C
또는 'D
을 꼭 볼 수 있습니다. (단, 'C
님의 사진을보실 수 있습니다).
하지만 배열에 대해? 만약 'A array
이 있다면 ('A | 'B) array
으로 생각할 수 없습니다. 배열의 요소를 'B
으로 수정하면 배열 배열이 잘못 되었기 때문에 실제로는 ('A | 'B) array
이고 'A array
이 아니기 때문입니다. 그러나 으로 ('A | 'B) array
은 어떨까요? 예, 배열에 'B
이 포함될 수 있기 때문에 이상하게 보일 것입니다. 그러나 이상하게도 나는 그것이 함수와 같다고 생각했습니다. 어쩌면, 결국, 나는 모든 것을 이해하지 못했지만 그것을 이해하는 데 오랜 시간이 걸렸기 때문에 여기에 내 생각을 말하고 싶었습니다.
TL; DR :
영구 :
+'a
함수 :
-'a
가변 : 불변 (
'a
)? 왜 강제로-'a
이 될 수 없습니까?,type 'a t = {mutable data : 'a} let x = {data = 42} (* getter *) x.data (* setter *) x.data <- 56
게터 타입
'a t -> 'a
있습니다 게터와 세터 필드 액세스 및 필드 설정 구문을 사용하여 표현된다
나는이 포스트가 미래의 OCaml 개발자들에게이 분산 문제를 쉽고 빠르게 이해하는 데 도움이 될 것으로 기대했던 것과 정확히 같은 종류의 대답을했습니다. – Lhooq
나는 당신이 "and setter * as type ..."을 의미한다고 생각한다. - 편집을 제출했는데, 나는 잘못 고치지 않았 으면 좋겠다. 몇 분 동안 정말 우연히 발견되었습니다. – ELLIOTTCABLE
그래, 확실히 :) 고마워! – ivg