我有一个返回数组最小值的函数。
该函数具有类型:
min : int array -> int
其实施是:
let rec min a = match a with
| [] -> 1000000000
| x :: [] -> x
| x :: xs -> let ms = min xs in if x < ms then x else ms;;
但是,我收到此错误:
Found min with unexpected type:
Wrong type int list -> int.
那么我如何模式匹配数组呢?
答案 0 :(得分:6)
您在模式中使用了列表符号,这导致了问题。数组常量如下所示:[| 3; 4; 5 |]
数组模式看起来与您期望的相同:
let f = function
| [| |] -> "empty"
| [| _ |] -> "one"
| [| _; _ |] -> "two"
| _ -> "many"
每个数组模式都匹配特定大小的数组。至少具有一定大小的数组是不匹配的。这与列表形成鲜明对比,列表具有这种灵活性。
使用Array.fold_left
或Array.fold_right
,而不是使用模式匹配,处理数组的更有用方法可能是使用function reset(){
};
$("#reset").click(function() {
reset();
});
或candidate_ID AS candidateID,
。
可能你已经习惯了一种语言,其中数组和列表或多或少是相同的。在OCaml中,您必须选择要使用的那个。
答案 1 :(得分:4)
与列表不同,数组不是归纳定义的。例如,列表是空列表或一对元素和另一个列表。归纳数据定义很好,因为它们允许归纳地,即递归地推理数据。该数组是一种非常不同的数据结构,它被定义为相同类型的固定数量的元素。因此,您的算法不适用于数组。而问题不仅在于语法。您无法通过数组上的归纳来表达最小值。您需要找到一些其他方式来表达最小值,例如,大小为A
的最小数组N
就是这样的元素m
,对于所有i, 0 <= i < N
我们都是有m <= A(i)
。如果您遵循此定义,则可以直接实现它。从第一个元素开始作为最小值的近似值,然后继续下一个元素,如果它小于当前最小值,则更新近似值。检查完所有元素后,您的最小元素将满足所需的属性。
关于空案例,那么你可以决定空数组的最小值是未定义的。通过引发返回类型int option
,或者通过引发异常隐式地表示你的函数是非全部的,你可以显式表示,并在注释中说明该函数仅为非空数组定义。或者,您可以将max_int
作为空数组的最小元素返回,因为空集的最大下限是Universe的最大值(在我们的示例中为max_int
)。
答案 2 :(得分:0)
这是使用Array.fold_left获取Ocaml Array中最小数量的正确方法:
let min a =
Array.fold_left
(fun x y ->
if x <=y then
x
else
y )
a.(0)
a
;;