2014-10-17 4 views
2
# let rec nth l n = 
    match l with 
    [] -> [] 
    |h::t -> if n = 0 then h 
     else nth t (n-1);; 
val nth : 'a list list -> int -> 'a list = <fun> 
# let rec drop n l = 
    if n = 0 then l else 
    match l with 
     [] -> [] 
     |h::t -> drop (n-1) t;; 
val drop : int -> 'a list -> 'a list = <fun> 
# let rec zipper a b = 
    match a with 
    [] -> b 
    |h::t -> h :: nth b 0 :: zipper t (drop 1 b);; 
val zipper : 'a list list -> 'a list list -> 'a list list = <fun> 
# zipper [1;3;5] [2;4;6];; 
Characters 8-9: 
    zipper [1;3;5] [2;4;6];; 
     ^
Error: This expression has type int but an expression was expected of type 
     'a list 

두 목록을 결합하려고했습니다. 각 단계는 괜찮은 것처럼 보였지만 마지막 문장 인 지퍼 [1; 3; 5] [2; 4; 6]를 입력하면 오류가 나타납니다.Ocaml 오류에 대한 '목록 목록

'a in'유형을 학습 한 것은 Ocaml의 모든 유형 일 수 있습니다. 그렇다면, 표현식 타입 int는 괜찮 았습니다. 나는 무엇을 잘못 생각했는지 모른다.

답변

1

리스트 안에있는 타입의 요소가 아닌, 기본 케이스에 빈리스트를 반환 할 때, 문제는 nth에있다. ! 따라서 Ocaml은 목록에 목록이 있다고 추론합니다.

당신은 몇 가지 방법으로 문제를 해결할 수 있습니다 : 목록이 비어입니다

  • 을 반환하는 기본값은 추가 인수를 전달 예외를 발생하거나 경우에 failwith를 사용
  • option 유형을 반환하면 문제가있을 때 , 문제가있는 경우 None을 반환 할 수 있습니다.