Ocaml 关于';名单 #让我们重新开始= 匹配 [] -> [] |h::t->如果n=0,则h else n次t(n-1);; val nth:'列表->int->'列表= #让rec放下n l= 如果n=0,则l=0 匹配 [] -> [] |h::t->下降(n-1)t;; val drop:int->“a列表->”a列表= #让我们来看看拉链= 匹配 []->b |h::t->h::nth b 0::拉链t(下降1 b);; val zippers:'列表->'列表->'列表= #拉链[1;3;5][2;4;6];; 字符8-9: 拉链[1;3;5][2;4;6];; ^ 错误:此表达式的类型为int,但表达式的类型应为int "名单",

Ocaml 关于';名单 #让我们重新开始= 匹配 [] -> [] |h::t->如果n=0,则h else n次t(n-1);; val nth:'列表->int->'列表= #让rec放下n l= 如果n=0,则l=0 匹配 [] -> [] |h::t->下降(n-1)t;; val drop:int->“a列表->”a列表= #让我们来看看拉链= 匹配 []->b |h::t->h::nth b 0::拉链t(下降1 b);; val zippers:'列表->'列表->'列表= #拉链[1;3;5][2;4;6];; 字符8-9: 拉链[1;3;5][2;4;6];; ^ 错误:此表达式的类型为int,但表达式的类型应为int "名单",,ocaml,Ocaml,我试图将两个列表合并在一起。每一步看起来都不错,但当我打字时 最后一句话[1;3;5][2;4;6]错误出现了 我了解到列表中的“a”类型可以是Ocaml中的任何类型。然后,表达式类型int是可以的,我想。。我不知道出了什么问题您的问题出在nth,因为您在基本大小写中返回的是一个空列表,而不是列表中类型的元素!因此,Ocaml推断您的列表包含列表 您可以通过以下几种方式进行修复: 如果列表为空,则引发异常或使用failwith 传递一个附加参数,该参数是要返回的默认值 返回一个选项类型,这样当

我试图将两个列表合并在一起。每一步看起来都不错,但当我打字时 最后一句话[1;3;5][2;4;6]错误出现了


我了解到列表中的“a”类型可以是Ocaml中的任何类型。然后,表达式类型int是可以的,我想。。我不知道出了什么问题

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

您可以通过以下几种方式进行修复:

  • 如果列表为空,则引发异常或使用
    failwith

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

  • 返回一个
    选项
    类型,这样当事情进展顺利时,您可以返回
    Some(result)
    ,当出现问题时,可以返回
    None

# 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