2010-05-12 5 views
5

a.ml에서 레코드 유형 t가 정의되고 a.mli에서 투명하게 으로 정의됩니다. 즉 d 인터페이스에서 형식 정의가 다른 모든 파일에 을 사용할 수 있습니다..ml 파일에서 다른 .ml 파일로 정의 된 유형에 액세스하는 방법

a.ml에는 t의 목록을 반환하는 함수 func도 있습니다. 다른 파일에서 이제

, 내가 FUNC를 호출 해요 b.ml, 지금 분명히 OCaml의 컴파일러는 컴파일러의 단지 목록을 D 목록에 저장된 개체의 D 타입, 을 추론 할 수 NT WUD. 그래서 b.ml에, 나는 "언 바운드 레코드 필드 레이블을 이름"vart의 D 타입을 추론 할 수없는 컴파일러로 의미가 선생님 컴파일러 오류가 지금 여기,

let tlist = A.func in 
let vart = List.hd tlist in 
printf "%s\n" vart.name  (*name is a field in record t*) 

을 창피 같은 근래.

첫 번째 질문 : 여기에 으로 명시 적으로 d 유형의 바트를 제공하려면 어떻게해야합니까? 나는 "vart하자 : A.t ="하자 시도했지만 같은 오류가 발생했습니다.

또한 d 목록의 첫 번째 요소를 가져오고 반환 형식을 A.t로 언급하는 다른 함수를 만들려고했지만 "Unbound value A.t"가 표시되었습니다.

let firstt = function 
    [] -> 0 
    | x :: _ -> A.t x ;; 

문제 컴파일러는 b.ml 에 A.t (유형)을 인식 할 수 없습니다입니다하지만 기능 A.func을 인식 할 수있다 :이했다. b.ml에서 A.t를 제거하면 컴파일러 오류가 발생하지 않습니다.

답변

7

컴파일러 파일 a.ml에서 유형 t를 지정 A.t을 인식 할 수입니다.

반면에 t x 여기서 t은 유형이고 x 변수는 유효한 표현식이 아닙니다. 이것이 문제의 근원입니다. 컴파일러는 에 의해 내 보낸 변수에서 t 이름을 찾습니다. 변수에 사용 된이 이름을 찾을 수 없으므로 오류를보고합니다. 이제 당신이 뭘하려고했는지에 대한

:

  • 유형 약어는 OCaml의에서 컴파일러에 대한 힌트가되지 않습니다. 그것은 가장 일반적인 유형을 추론하는 알고리즘을 가지고 있습니다. 일부 예외는 있지만 입력하지 않습니다. 그런 다음 주석이 가장 일반적인 유형의 특수화임을 확인합니다. 당신이 제공하는 타입 주석은 절대로 (다시는, 당신을 걱정하지 않는 몇몇 가능한 예외가있을 때) 그것이 마음을 바꾸게합니다. 파일 b.ml 분야 레코드 유형 A.tr 입력 r.A.ff에 액세스하려면

  • . 여기 tlist

0
let tlist = A.func in 
let vart = List.hd tlist in 
printf "%s\n" vart.name  (*name is a field in record t*) 

가 함수 인, 나는 그것이 유형 'a -> A.t list입니다 가정,하지만 당신은 let vart = List.hd tlist을 쓸 때 해당 기능상의 List.hd을 적용하고 있습니다.

예를 들어 let tlist = A.func (your_argument-s-_here)과 같이 A.t의 목록을 얻으려면 함수에 대한 인수를 제공해야합니다. 오류의 원인이라고 생각하면 컴파일러는 모듈간에 유형을 추론 할 수 있습니다.

관련 문제