Ocaml:将int列表中的所有整数相加,并将其作为int选项输出

Ocaml:将int列表中的所有整数相加,并将其作为int选项输出,ocaml,Ocaml,。编写一个函数,该函数接受整数列表并返回列表中所有元素的总和。如果列表为空,则返回None 这是我现在的代码: let rec sum (xs: int list) = match xs with | [] -> None | [x] -> Some x | hd::tl -> let m = (hd + (sum tl)) in Some m ;; 问题是,我似乎无法找到一种方法来累加最后一个元素而不出错。 这是我的

。编写一个函数,该函数接受整数列表并返回列表中所有元素的总和。如果列表为空,则返回None

这是我现在的代码:

let rec sum (xs: int list) =
   match xs with
   | [] -> None
   | [x] -> Some x
   | hd::tl -> let m = (hd + (sum tl)) in
                 Some m
;;
问题是,我似乎无法找到一种方法来累加最后一个元素而不出错。
这是我的错误。
错误:此表达式的类型为int,但表达式应为'a option'类型。

sum
的递归调用确实返回
int option
。您之所以知道这一点,是因为您是函数的作者,并对其进行了编码以返回该类型:-)您可以编写一个返回int的helper函数,也可以从
sum
的返回值中提取int,类似这样:

let tlsum =
    match sum tl with
    | None -> (* figure this part out *)
    | Some n -> (* figure this part out *)

sum
的递归调用确实返回了
int选项
。您之所以知道这一点,是因为您是函数的作者,并对其进行了编码以返回该类型:-)您可以编写一个返回int的helper函数,也可以从
sum
的返回值中提取int,类似这样:

let tlsum =
    match sum tl with
    | None -> (* figure this part out *)
    | Some n -> (* figure this part out *)

这看起来像是一项任务,所以我会含糊其辞:

最简单的方法可能是首先定义一个类型为
int list->int
的函数,该函数返回“正常”和(空的情况下为0)。该函数将是递归的,
0
将对应于基本情况

然后编写另一个类型为
int list->int option
的函数,该函数检查其参数是否为空,并基于此执行正确的操作


尝试直接编写递归可能不是一个好主意,因为有两种情况需要处理
[]
:当它是列表中的唯一元素时,以及当它位于非空列表的末尾时。

这看起来像是一个赋值,所以我不太清楚:

最简单的方法可能是首先定义一个类型为
int list->int
的函数,该函数返回“正常”和(空的情况下为0)。该函数将是递归的,
0
将对应于基本情况

然后编写另一个类型为
int list->int option
的函数,该函数检查其参数是否为空,并基于此执行正确的操作


尝试直接编写递归可能不是一个好主意,因为有两种情况需要处理
[]
:当它是列表中的唯一元素时,以及当它位于非空列表的末尾时。

您可以定义两个int选项的加法

let sum l =
  let (+) a b =
    match (a,b) with
      | (None,x) | (x,None) -> x
      | (Some x,Some y)     -> Some (x+y)
  in
  let convert a = Some a in
  let opt_l=List.map convert l  in
  List.fold_left (+) None opt_l
试验


您可以定义两个int选项的加法

let sum l =
  let (+) a b =
    match (a,b) with
      | (None,x) | (x,None) -> x
      | (Some x,Some y)     -> Some (x+y)
  in
  let convert a = Some a in
  let opt_l=List.map convert l  in
  List.fold_left (+) None opt_l
试验