模式匹配数组

时间:2016-10-26 19:10:12

标签: ocaml

我有一个返回数组最小值的函数。

该函数具有类型:

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.

那么我如何模式匹配数组呢?

3 个答案:

答案 0 :(得分:6)

您在模式中使用了列表符号,这导致了问题。数组常量如下所示:[| 3; 4; 5 |]

数组模式看起来与您期望的相同:

let f = function
| [| |] -> "empty"
| [| _ |] -> "one"
| [| _; _ |] -> "two"
| _ -> "many"

每个数组模式都匹配特定大小的数组。至少具有一定大小的数组是不匹配的。这与列表形成鲜明对比,列表具有这种灵活性。

使用Array.fold_leftArray.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
;; 
相关问题