递归函数,遍历元组列表(int * int)并添加第二个值

时间:2018-04-07 07:29:53

标签: list tuples ocaml

我想编写一个遍历元组列表(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 

1 个答案:

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