我想通过递归方式列出两个列表的总和。
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?
有什么问题?
答案 0 :(得分:2)
问题是hd2
在案例[] -> [hd + hd2]@(list_add tl tl2)
中未定义。我想你正试图写一些类似
let rec listadd a b =
match a with
| [] -> b
| hd :: tl ->
(match b with
| hd2 :: tl2 -> [hd + hd2]@(listadd tl tl2)
| [] -> a
)
我还建议不要使用列表连接,而是直接将一个元素附加到列表的头部:
let rec listadd a b =
match a with
| [] -> b
| hd :: tl ->
(match b with
| hd2 :: tl2 -> (hd + hd2) :: (listadd tl tl2)
| [] -> a
)
虽然可行,但只使用一个匹配可以简化代码:
let rec listadd a b =
match a, b with
| [], _ -> b
| _, [] -> a
| hd :: tl, hd2 :: tl2 -> (hd + hd2) :: (listadd tl tl2)
答案 1 :(得分:1)
名称hd2
由上面一行中的模式匹配定义。但是只为该模式匹配和结果定义了名称。因此错误的行上hd2
没有定义。由于这个错误的行与空列表匹配,因此不清楚您打算如何编写代码。
作为一个可能的提示,在我看来,第二个列表为空的情况应该与第一个列表为空的情况相同。
答案 2 :(得分:0)
使用List.map2函数:
let listadd l l' = List.map2(fun x y -> x+y) l l';;