我正在研究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
。
答案 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
而不是[]
。)