다음과 같은 유형을 정의하려고합니다.ocaml 레코드 유형 및 null
유형 aaa = NULL | {a : int; b : int} ;;
하지만 컴파일러는 허용하지 않습니다. 레코드 유형을 다른 것과 혼합 할 수없는 이유가 확실하지 않습니다.
레코드 유형 또는 널 레코드이고 {a = -999; b = -999}.
더 좋은 방법은 무엇입니까?
다음과 같은 유형을 정의하려고합니다.ocaml 레코드 유형 및 null
유형 aaa = NULL | {a : int; b : int} ;;
하지만 컴파일러는 허용하지 않습니다. 레코드 유형을 다른 것과 혼합 할 수없는 이유가 확실하지 않습니다.
레코드 유형 또는 널 레코드이고 {a = -999; b = -999}.
더 좋은 방법은 무엇입니까?
정의의 "레코드"부분은 별도의 유형으로 수행되어야합니다. 그런 다음 "없음"또는 "일부 값"을 표현하려면 "옵션"유형으로이를 래핑 할 수 있습니다.
type aaa = {a: int; b: int}
type bbb = aaa option
첫 번째 문제 : Objective Caml 방식에서는 생성자 없이도 공용체 형식을 사용할 수 없습니다. 다음과 같은 수수께끼를 고려 value
는 노동 조합 유형이며, 따라서 어떤 멤버 a
이 없습니다 Null
을 수 있기 때문에
type test = Null | {a : int ; b: int }
let value = { a: 0 ; b : 42 } in print_int value.a
두 번째 줄이 올바르지 않습니다. 이것은 Objective Caml이 어떤 대가를 치르더라도 회피하지 않는 조합 유형의 가치에 대해 암시 적으로 가정합니다. 즉, 생성자가 필요합니다.
그러나 익명 레코드 유형이 것 때문에 심지어는 충분하다 :
type test = Null | Pair of { a : int ; b : int }
match Pair { a : 0 ; b : 42 } with
| Null -> 0
| Pair p -> p.a
는 여기에서 p
의 유형이 될 것입니까? 익명 레코드 유형을 허용하면 확실히 해결할 수 있지만 유형 통합 방법을 사용하여 처리하기가 매우 어렵고 지원을 위해 많은 추가 구성이 필요하기 때문에 단순한 추가는 아닙니다 (예 : < ; ... >
, 객체 처리를위한 #type
및 value :> type
구조체).
언어 디자이너는 쉬운 방법을 사용했으며 모든 레코드 유형에 이름을 지정해야했습니다. 물론 매우 단순한 레코드를 가지고 있다면 튜플을 사용할 수 있습니다 :
type test = Null | Pair of int * int
멋진 답변, 통일은 정말 두통입니다. – 0xFF