。编写一个函数,它接受一个整数列表并返回列表中所有元素的总和。如果列表为空,则返回None。
这是我现在的代码:
/Users/{Your_Dir_Name}/.eclipse
问题是我似乎无法找到一种方法来添加最后一个元素而不会出现错误 这是我的错误。 错误:此表达式的类型为int,但表达式的类型为'a option。
答案 0 :(得分:1)
您对sum
的递归调用确实会返回int option
。你知道这个,因为你是函数的作者,你编写它来返回那个类型:-)你可以写一个返回int的辅助函数,或者你可以从{{的返回值中提取int 1}},像这样:
sum
答案 1 :(得分:1)
您可以定义两个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
测试
# sum [];;
- : int option = None
# sum [1;2];;
- : int option = Some 3
答案 2 :(得分:0)
这看起来像是一项任务,所以我会模糊:
最简单的方法可能是首先定义一个类型int list -> int
的函数,该函数返回" normal" sum(空案例为0)。该函数将是递归的,0
将对应于基本情况。
然后编写另一个int list -> int option
类型的函数,检查它的参数是否为空,并根据它做正确的事。
尝试直接编写递归可能不是一个好主意,因为有两种情况需要处理[]
:它是列表中唯一的元素,当它是&#39 ; s在非空列表的末尾。