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

时间:2017-02-27 03:54:28

标签: 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?

有什么问题?

3 个答案:

答案 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';;