Ocaml:将int列表中的所有整数相加,并将其作为int选项输出
。编写一个函数,该函数接受整数列表并返回列表中所有元素的总和。如果列表为空,则返回None 这是我现在的代码: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 ;; 问题是,我似乎无法找到一种方法来累加最后一个元素而不出错。 这是我的
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
试验