질문컴파일러가 제네릭 형식 변수의 이름이 다른 두 개의 동일한 서명을 다른 형식으로 식별하는 이유는 무엇입니까?
왜
val of_bindings : (key * '_a) list -> '_a t
val of_bindings : (key * 'a) list -> 'a t
다른 서명은?
상황
좀지도 확장 구현이 있습니다
MAPEXT.ml :
module type T = sig
include Map.S
val of_bindings : (key * 'a) list -> 'a t
end
mapExt.mli :
module Make (Key : Map.OrderedType)
: MAPEXT.T with type key = Key.t
을
mapExt.ml :
module Make (Key : Map.OrderedType) = struct
include Map.Make (Key)
let of_bindings =
let rec of_bindings acc =
function | (k, v) :: t -> of_bindings (add k v acc) t
| [] -> acc in
of_bindings empty
end
컴파일러 내가 제네릭 형식 변수의 이름은 단지 다른 신호에 대한 중요하지 않다 생각 ocamlopt -c MAPEXT.ml mapExt.mli mapExt.ml
Error: The implementation mapExt.ml does not match the interface mapExt.cmi: ... At position module Make(Key) : Values do not match: val of_bindings : (key * '_a) list -> '_a t is not included in val of_bindings : (key * 'a) list -> 'a t File "mapExt.ml"
의 결과로 나에게 오류를 준 유형. 하지만 지금부터는 다른 의미를 가진 것처럼 보입니다.
이 코드를 컴파일하는 방법을 피하려면 어떻게해야합니까?
관련 : What is the difference between 'a and '_l?
"부분 적용을 통해 얻은 기능이 다형성이 아니므로"https://ocaml.org/learn/faq.html#Typing 섹션을 참조하십시오. – camlspotter