2010-11-22 5 views
10

'a'_l의 차이점은 무엇입니까?'a와'_l의 차이점은 무엇입니까?

이 오류를보고하고,이를 이해할 수 :

Error: This expression has type ('a -> float polynomial) list but an expression was expected of type float polynomial list derivlist: ('_l → float polynomial) list 

답변

23

_는 약 다형성 변수를 나타낸다 : 그것을 일반화 될 수없는 위치에있다.

OCaml FAQ에서 약한 다형성과 관련된 두 가지 설명이 있습니다 : A function obtained through partial application is not polymorphic enough과 그 다음 것을보십시오.

이것은 일반적으로 로컬이 아닌 참조 (형식을 일반화 할 수 없음)를 사용하거나 구문 함수가 아닌 다형 함수를 정의 할 때 발생합니다 (이들은 fun x -> ..으로 시작하지 않고 함수 응용 프로그램으로 시작 함). 어떤 경우에는 쉬운 수정 (η 확장, FAQ 참조)이 있습니다. 때로는없는 경우도 있고 때로는 프로그램이 엉성한 경우도 있습니다.

쉬운 예 : let a = ref []에는 다형성 a list ref 유형이 없습니다. 그렇지 않으면 int listbool list을 둘 다 사용할 수 있으며 참조를 변경하여 여러 유형의 요소를 혼합 할 수 있습니다. 대신 '_a list ref 유형을 얻습니다. 즉, 유형이 다형성이 아니라 단지 을 알 수 없으므로입니다. 특정 유형의 a으로 작업을 수행하면 '_a이 수정됩니다. 제한 값의 충분히 설명과 실제로 OCaml의 종류 검사부에서 구현 된 "이완"값 제한 용

# let a = ref [];; 
val a : '_a list ref = {contents = []} 
# let sum_of_a = List.fold_left (+) 0 !a;; 
val sum_of_a : int = 0 
# a;; 
- : int list ref = {contents = []} 

자크 Garrigue (2004)에 의해 용지 Relaxing the Value Restriction 참조.

1

컴파일러의 오류 메시지에 약한 변수가 있지만 약한 변수가 오류와 관련이 있는지 확신하지 못합니다 (유형 변수의 상태가이 원인 일 수는 없습니다. 메시지).

polynomial의 두 가지 유형을 정의하지 않았습니까? 질문에 대한 답은 gashe가 지적한 두 가지 질문 바로 위의 질문입니다 ("Error message: a type is not compatible with itself").

관련 문제