OCaml:从int列表列表转到int

时间:2015-03-05 23:46:26

标签: unix ocaml

我正在研究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

2 个答案:

答案 0 :(得分:1)

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

好吧,我们可以同意sumImRow类型为int list -> int,因为它从列表中获取元素,然后返回它们的总和。

sumImage将有一个list参数,因为它在模式匹配中解构它。然后它返回list结果的sumImRow,意味着sumImage获取sumImRow所采用的列表作为参数,并返回结果列表。所以我们确实有int list list -> int list

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

您还可以使用List.fold_left

制作更改进的代码
let sumImRow l = List.fold_left (+) 0 l;;
let sumImage l = List.fold_left (List.fold_left (+)) 0 l;;

答案 1 :(得分:0)

sumImage的两个返回值都是列表。所以它的返回类型很自然就是一个列表。

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