2012-02-12 2 views
2

리스트로 변환하고 싶은 (int * string) 튜플을 가지고 있습니다. 튜플은 (N, E) 형태이며, N은 E 요소의 발생 횟수입니다. 함수는 N 발생 횟수가 N 인 목록을 반환해야합니다. 예제는 다음과 같습니다. 이 함수가 tuple_decode라고 가정 해 봅시다. 나는 다음과 같은 오류가이 기능을 컴파일 할 때튜플을리스트로 변환하는 Ocaml 함수

let tuple_decode acc (n,elem) = 
let add_one_elem i = 
    match i with 
      0 -> acc 
     | i -> elem :: acc ; add_one_elem (i-1) (* Line 184 *) 
in 
add_one_elem n 
;; 

을 다음과 같이

tuple_decode (1, "A") -> ["A"] 
tuple_decode (2,"B") -> ["B";"B"] 
tuple_decode (4,"C") - > ["C";"C";"C";"C"] 

tuple_decode 기능입니다.

File "all_code.ml", line 184, characters 11-22: 
Warning 10: this expression should have type unit. 
File "all_code.ml", line 184, characters 25-37: 
Error: Unbound value add_one_elem 

누군가이 오류와 경고를받는 이유를 알아낼 수 있습니까?

감사 Puneet

답변

6

경고는 ;를 사용하여 시퀀스 구성에서 비롯됩니다. S1 ; S2을 쓸 때 컴파일러에서는 S1unit 유형이 될 것으로 예상합니다. 그러나 여기 S1은 값이 버려지는 목록 (elem::acc) 을 반환합니다. 또한 acc을 인수로 전달하지 않았으므로이 값은 모든 재귀 호출 후에 변경되지 않습니다.

오류는 add_one_elem의 재귀 적 사용으로 인한 것입니다. rec 키워드를 사용하지 않았기 때문에 add_one_elem (i-1)이 호출되면 OCaml은 add_one_elem이 재귀 적으로 정의되고 있음을 알 수 없습니다.

또한, acc 결과 축적 add_one_elem의 매개 변수해야한다 : 또한

let tuple_decode (n, elem) = 
    let rec add_one_elem i acc = 
     match i with 
     | 0 -> acc 
     | i -> add_one_elem (i-1) (elem::acc) 
    in add_one_elem n [] 
+2

을, S1' 다음 결과 unit''유형이없는 '경우, 경고 부분에 대한 것을주의하는 것이 재미있다 버려졌습니다. 따라서 누산기를 함수의 인수로 전달하지 않으면 재귀 호출은 쓸모가 없습니다. – Thomas

+0

감사합니다. 답변을 명확하게하기 위해 제안을 추가했습니다. – pad