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:    
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';;

最新更新