Types 用OCaml中的数组、列表或映射定义int矩阵?

Types 用OCaml中的数组、列表或映射定义int矩阵?,types,ocaml,Types,Ocaml,我需要将int矩阵定义为一个类型。矩阵的列或行表示城市,矩阵中的元素表示行所在城市和列所在城市之间的距离。矩阵的维数可能会改变(我们可以添加或删除城市),但它总是非常小 我在int数组、int列表和定义如下的map类型之间犹豫: module MatOrd = struct type t = string * string let compare ((a, b): string * string) ((c, d) : string * string) = if Pervasi

我需要将int矩阵定义为一个类型。矩阵的列或行表示城市,矩阵中的元素表示行所在城市和列所在城市之间的距离。矩阵的维数可能会改变(我们可以添加或删除城市),但它总是非常小

我在
int数组
int列表
和定义如下的
map
类型之间犹豫:

module MatOrd = struct 
  type t = string * string
  let compare ((a, b): string * string) ((c, d) : string * string) = 
    if Pervasives.compare a  c <> 0
    then Pervasives.compare a c 
    else Pervasives.compare b d
end

module MatMap = Map.Make(MatOrd)

考虑到我提到的优点和缺点,您建议使用哪种类型?

这种或那种类型的适用性实际上取决于您打算使用它实现哪些操作。你会用你的类型计算什么

例如,您可能希望利用在某处实现的矩阵操作,例如,这可能有助于解决最短路径问题。在这种情况下,使用矩阵是有意义的,并且有一个单独的函数
string->int
,可以将城市名称转换为矩阵坐标。另一方面,如果您只需要一个计算量很少的数据存储,那么像上面这样的
Map
类型可能更有意义

在不知道要计算什么的情况下,很难给出非常有见地的答案,但是关于你的建议:

  • 请记住,列表是不可变的,因此
    int list
    的实用程序有限
  • 如果制作二维数组,请注意数组是可变的引用,并且会相应地处理该假装,以便在执行以下操作之后:

    let a = Array.make 3 0;;
    let a = b;;
    b.(0) <- 42;;
    
    首先计算内部
    make
    调用,三个调用共享相同的引用 外部数组的行数。有关如何创建矩阵的信息,请参见


顺便说一句,您可以在数组上进行模式匹配(在页面底部显示模式),但在放置模式变量时必须考虑数组的维度。谢天谢地,您可以使用
,正如您所说,数组的维数非常小。

您不能编写
将数组与[|first_元素;_rest_元素]->…
匹配,因为这不是访问数组元素的方式<代码>其余元素既不存在于内存中,也不在类型系统中具有类型。但你们可以很好地用数组进行模式匹配。一般来说,良好的链接和合理的答案,但我不认为你们在第二个要点中指的是“按名称传递”。Ocaml从不使用“按名称传递”语义。下面是对“按名称传递”语义的描述:此外,这是因为它们不是按名称传递的,而外部构造函数的参数是按值传递的(因此只计算一次),所以näive二维数组创建失败。当然!详细更正,以消除任何歧义/错误
let a = Array.make 3 0;;
let a = b;;
b.(0) <- 42;;
let m = Array.make 2 (Array.make 3 0);;
m : int array array = [|[|0; 0; 0|]; [|0; 0; 0|]|]
m.(0).(0) <- 1;;
- : unit = ()
m;;
- : int array array = [|[|1; 0; 0|]; [|1; 0; 0|]|]