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;;
我正在开发 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;;