关于列表列表的Ocaml错误

时间:2014-10-17 16:11:07

标签: ocaml

# 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是好的我想..我不知道什么是错的

1 个答案:

答案 0 :(得分:1)

您的问题在nth,因为您在基本情况下返回一个空列表,而不是列表中的类型元素!因此,Ocaml推断您的列表包含列表。

您可以通过以下几种方式解决问题:

  • 在列表为空的情况下引发异常或使用failwith

  • 传递一个附加参数,该参数是返回的默认值

  • 返回option类型,以便您可以在问题解决时返回Some(result),并在出现问题时None