# 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]出现了错误。
我学会了类型&#39;一个列表可以是Ocaml中的任何类型。然后,表达类型int是好的我想..我不知道什么是错的
答案 0 :(得分:1)
您的问题在nth
,因为您在基本情况下返回一个空列表,而不是列表中的类型元素!因此,Ocaml推断您的列表包含列表。
您可以通过以下几种方式解决问题:
在列表为空的情况下引发异常或使用failwith
传递一个附加参数,该参数是返回的默认值
返回option
类型,以便您可以在问题解决时返回Some(result)
,并在出现问题时None