ocaml列出的两个列表中每个元素的总和(初学者)

ocaml列出的两个列表中每个元素的总和(初学者),ocaml,Ocaml,我想用递归的方法把两个列表求和列成一个列表 let rec listadd a b match a with | [] -> b | hd::tl -> ( match b with | hd2::tl2 -> [hd + hd2]@(list_add tl tl2) | [] -> [hd + hd2]@(list_add tl tl2) ) 但是,它会导致错误 File "test.ml", line 56, characters 17-20:

我想用递归的方法把两个列表求和列成一个列表

let rec listadd a b
  match a with
 | [] -> b
 | hd::tl -> 
 ( match b with
 | hd2::tl2 -> [hd + hd2]@(list_add tl tl2)
 | [] -> [hd + hd2]@(list_add tl tl2)
 )
但是,它会导致错误

File "test.ml", line 56, characters 17-20:    
Error: Unbound value hd2
Did you mean hd?

问题是什么?

问题是
hd2
[]->[hd+hd2]@(list\u add tl tl2)
的情况下未定义。我猜你是想写点什么

让rec list添加a b=
匹配
|[]->b
|hd::tl->
(b)与
|hd2::tl2->[hd+hd2]@(列表添加tl tl2)
|[]->a
)
我还建议不要使用列表连接,而是直接将元素附加到列表的头部:

让rec list添加a b=
匹配
|[]->b
|hd::tl->
(b)与
|hd2::tl2->(hd+hd2)::(列表添加tl tl2)
|[]->a
)
虽然这样做有效,但只需使用一个匹配项即可大大简化代码:

让rec list添加a b=
将a、b与
|[],uuB->b
|_u,[]->a
|hd::tl,hd2::tl2->(hd+hd2)::(listaddtl2)

名称
hd2
由上一行中的模式匹配定义。但名称仅为一个模式匹配和结果定义。因此,在出错的行中没有定义
hd2
。由于此错误行与空列表匹配,因此不清楚您打算让代码做什么


作为一个可能的提示,在我看来,第二个列表为空的情况应该与第一个列表为空的情况一样处理。

并且使用list.map2函数:

   let listadd l l' = List.map2(fun x y -> x+y) l l';;

这对不同长度的列表不起作用。你完全正确-这个答案更多的是提供了一种不同的求和方法。更简短的是:
let listadd=List.map2(+)