我需要定義一個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