我想编写一个遍历元组列表(int * int)的函数,如果元组的第一个值是int 0,则添加元组的第二个值。我想出了以下代码,但是,它会引发每个案例的异常,任何人都可以指出函数中的错误是什么?提前致谢!
let rec tup x = match x with (a,b)::t -> if a > 0 then b + tup(t) else 0 + tup(t) | []->failwith("a");;
test case: (int * int) list = [(0, 2); (1, 10); (0, 20)] should return 10
答案 0 :(得分:0)
您将此函数设计为递归,因此其最后一次调用将始终与[]
匹配。如果您将failwith("a")
更改为0
,则功能会按预期运行:
let rec tup x = match x with
(a,b)::t -> if a > 0 then b + tup(t) else tup(t)
| [] -> 0
;;
结果:
# tup [(0,2); (1,10); (0,20)];;
- : int = 10
# tup [(3,4); (1,10); (0,20)];;
- : int = 14
# tup [];; (* You don't want to fail in this case *)
- : int = 0