2016-10-09 3 views
3

안녕하세요 저는 OCaml을 처음 사용합니다. 그리고 꼬리 재귀의 기본 구문을 배우려고합니다. 목록을 가져 와서 요소와 색인이 포함 된 duples로 목록을 반환하기 위해 다음 코드를 작성했습니다. 예 : [ "b"; "c"; "dd";] -> [("b", 0); ("c", 1); ("DD", 2)] Ocaml 유형 오류 열거 예제의 경우

나는 다음과 같은 코드를 작성 :

let enumerateWithTail lst = 
    let rec inside lst acc index = 
    match lst with 
    | [] -> acc 
    | x::xs -> inside xs (x,index)::acc (index+1) 
in inside lst [] 0;; 

이 작동하지 않고 (적어도 나는 그것의 꽤 비슷한 생각) 내 교수 예제가 작동합니다. 내 교수 코드는 다음과 같습니다에

감사를 이 표현은 B 'A *'을 입력 가지고 있지만 표현이 C 목록 '형식의 예상 : 내 코드가 오류를 제공하는 이유

let enumerate lst = 
    let rec aux lst acc = 
    match lst with 
    | [] -> acc 
    | x::xs -> let (eList, index) = acc 
       in aux xs ((x, index)::eList, index+1) 
    in List.rev(fst(aux lst ([], 0))) 

누군가가 설명해 주시겠습니까 전진!

답변

6

문제는 우선합니다. 기능 응용 프로그램은 높은 ::를 포함한 모든 연산자보다 우선 순위, 그래서이 있습니다

inside xs (x,index)::acc (index+1) 

는 다음과 같이 해석됩니다

(inside xs (x,index)) :: (acc (index+1)) 

당신이 원하는 것은 반면 :

inside xs ((x,index)::acc) (index+1) 
+2

이 우선 순위 문제가왔다 반복적으로 여기에 최근에. OCaml의 교사는주의해야합니다. 일찍 설명해야 할 부분 일 수 있습니다. –