OCaml:从 int 列表列表到 int

OCaml: Going from int list list to int

我正在开发 OCaml 运动检测程序。它分析两个图像并检测是否有运动。一部分要求我对一行值求和,然后对整个图像求和。这是我目前拥有的:

let rec sumImRow(maskedrow) = 
 match maskedrow with 
   | [] -> 0
   | mskRhd::mskRtl -> mskRhd + (sumImRow mskRtl)
   ;;

let rec sumImage(maskedimage) =
 match maskedimage with
   | mskRhd::mskRtl -> (sumImRow mskRhd)::(sumImage mskRtl)
   | _ -> [] 
   ;;

并且给定值为int list list -> int list = <fun>。 我不太明白为什么这会给我 int list.

sumImage的两个return值都是列表。所以它的 return 类型自然是一个列表。

(很可能你应该在 sumImage 中使用 + 而不是 ::。基本情况应该是 0 而不是 []。)

tl;dr:您构建了一个新列表而不是对整数求和。

嗯,我们可以同意 sumImRow 具有类型 int list -> int,因为它从列表中获取元素,然后 return 它们的总和。

sumImage 将有一个 list 参数,因为它在模式匹配中解构它。然后 returns sumImRow 的结果的 list,意思是 sumImage 得到一个列表作为参数,sumImRow 得到一个列表,returns 一个列表结果。所以我们确实有 int list list -> int list.

您可以通过在 sumImage 的匹配结果中将 :: 替换为 + 并将 [] 替换为 0 来避免这种情况。

您还可以使用 List.fold_left:

来改进代码
let sumImRow l = List.fold_left (+) 0 l;;
let sumImage l = List.fold_left (List.fold_left (+)) 0 l;;