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 "名单",
我试图将两个列表合并在一起。每一步看起来都不错,但当我打字时 最后一句话[1;3;5][2;4;6]错误出现了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 传递一个附加参数,该参数是要返回的默认值 返回一个选项类型,这样当
我了解到列表中的“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