Ocaml 模式匹配数组

Ocaml 模式匹配数组,ocaml,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;; 那么如何匹配数组呢?您在模式中使用了列表符号,这导致了问题。数组常量如下所示:[|3;4;5 |]

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

该函数具有以下类型:

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;;

那么如何匹配数组呢?

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

阵列阵列的外观与预期相同:

let f = function
| [| |] -> "empty"
| [| _ |] -> "one"
| [| _; _ |] -> "two"
| _ -> "many"
每个数组模式都匹配一个特定大小的数组。至少具有特定大小的数组不匹配。这与列表不同,列表具有这种灵活性

处理数组的一种更有用的方法可能是使用
array.fold\u left
array.fold\u right
,而不是使用模式匹配


可能您已经习惯了一种语言,其中数组和列表或多或少是相同的。在OCaml中,您必须选择要使用的阵列。

与列表不同,阵列的定义不是归纳式的。例如,列表可以是空列表,也可以是元素和另一个列表的一对。归纳数据定义很好,因为它们允许对数据进行归纳推理,即递归推理。数组是一种非常不同的数据结构,定义为相同类型的固定数量的元素。因此,您的算法不适用于数组。问题不仅在于语法。不能通过数组上的归纳来表示最小值。您需要找到其他表示最小值的方法,例如,数组
a
的最小值
N
就是这样的元素,
m
,对于所有
i,0,这里有一个正确的方法,使用array.fold\u left来获得Ocaml数组中的最小值:

let min a =
  Array.fold_left
    (fun x y ->
      if x <=y then 
        x
      else 
        y )
  a.(0)
  a
;; 
让最小值为a=
Array.fold_左
(乐趣x y->

如果x“100000000”对于某些输入,将给出不正确的结果,您应该找到一种不涉及幻数的方法。您以错误的方式访问它。您可以使用数组语法对数组进行模式匹配。但是这里没有head::tail模式。数组是通过索引直接访问的。如果愿意,您可以将数组转换为列表。Regar叮当声
max_int
,这是相关的:
let min a =
  Array.fold_left
    (fun x y ->
      if x <=y then 
        x
      else 
        y )
  a.(0)
  a
;;