我需要定义一个int类型的矩阵。矩阵的一列或一行代表city
,矩阵中的元素表示行城与列之城之间的distance
。矩阵的维数可能会发生变化(我们可能会增加或删除城市),但它总是很小。用OCaml中的数组,列表或映射定义int的矩阵?
我犹豫之间int array array
,int list list
并用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)
然后int MatMap.t
可以表示为int的矩阵。这个定义的一个优点是我可以直接写一个城市的名字作为矩阵的坐标。对于int array array
和int list list
而言,我似乎必须记住坐标的含义......
此外,我们无法与数组进行模式匹配吗?例如,我们不能写:
match a_array with
[| first_element; the_rest_elements |] -> ...
有我提到的优点和缺点,或不是,你建议哪种类型?
你不能写'match a_array with [| first_element; the_rest_elements |] - > ...因为这不是你访问数组元素的方式。 'the_rest_elements'既不存在于内存中,也不具有类型系统中的类型。但是你可以很好地与数组进行模式匹配。 – 2011-12-27 08:14:19