Ocaml 我可以合并这个代码吗?还是有更好的解决方案?

Ocaml 我可以合并这个代码吗?还是有更好的解决方案?,ocaml,higher-order-functions,Ocaml,Higher Order Functions,我正在创建一个函数,将整数列表中的所有数字相加。以下是我当前的解决方案: let rec super_sum (nlists : int list list) : int = let acc = 0 in match nlists with | [] -> 0 | head :: tail -> match tail with | [] -> List.fold_left (+) acc head | list -> List.f

我正在创建一个函数,将整数列表中的所有数字相加。以下是我当前的解决方案:

let rec super_sum (nlists : int list list) : int =
  let acc = 0 in
  match nlists with
  | [] -> 0
  | head :: tail ->
    match tail with 
    | [] -> List.fold_left (+) acc head
    | list -> List.fold_left (+) acc head + super_sum list ;;

我觉得我可以巩固这一点。我使用了两次
List.fold_left(+)acc head
,我觉得我可以创建一些功能来防止这种情况。

我不会给你答案,因为如果你能自己找到它会更好,但我会给你一些提示来找到它

  • 您需要做的第一件事是对
    int list
    的所有元素求和,这是您已经对
    list.fold_left(+)acc head执行的操作

  • 现在需要做的第二件事是在列表列表上迭代,并对第一步计算的总和求和。问题是,在这一步中,您已经知道如何对整数列表求和,因此您不需要对元素求和,而只需要对元素之和求和


  • 我甚至不能提供一个框架,因为它可以为您提供即时解决方案。

    有一个单行实现,是的。您可以使用两个嵌套的折叠来计算整个结果。还要注意,您的值
    acc
    没有实际用途。它是一个不可变的0值。因此,您可以在所有的
    acc
    中使用0。从任何意义上讲,它肯定不是一个累加器。