我想递归列出两个列表的列表。
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_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)
名称 hd2
由上线中的模式匹配定义。但是该名称仅针对该模式匹配和结果定义。因此,在错误的行中,hd2
没有定义。由于此错误的行与一个空列表匹配,因此尚不清楚您打算要执行的代码。
作为可能的提示,在我看来,第二个列表为空的情况应与第一个列表为空的情况相同。
并使用list.map2函数:
let listadd l l' = List.map2(fun x y -> x+y) l l';;