【发布时间】:2012-01-10 09:54:45
【问题描述】:
我有这个问题仍然困扰着我很多。我有一个(string * string list) list,我想将它转换为布尔矩阵。
我在转换它时有一个特殊条件。例如我有这个列表:
let entries = [("name", ["string"; "label"]); ("label", ["int"; "name"]);
("symbol", ["string"])]
其中“string”和“int”是未定义类型,未定义类型,因为在我的真实数据中,我没有定义描述这种类型。所以我建立了一个未定义类型的列表。
let undefined = ["string"; "int"]
列表中的第一个位置(“name”、“label”、“symbol”)是定义类型,定义类型是我在数据中定义的类型。
let defined = ["name"; "label"; "symbol"]
我正在尝试这样做:来自entries,位置应该是:
name: 2; string: 0; label: 3; int: 1; symbol: 4
当显示列表entries 中的依赖关系时,它不会改变它们的位置。例如:name(2) 链接到string(0) 和label(3),并且label (3) 有一个边到int(1) 和name (2),`等等...
我让这些函数返回列表中的位置(num_of_name)和元素(name_of_num)。
let rec position x = function
| [] -> raise Not_found
| y :: ys -> if x = y then 0 else 1 + position x ys
let len_undefined = List.length undefined
let num_of_name defined undefined len_undefined s =
try (position s defined) + len_undefined;
with Not_found -> position s undefined
let name_of_num defined undefined len_undefined k =
if k < len_undefined then
List.nth undefined k else
List.nth defined (k - len_undefined)
所以我想从entries 列表中构建一个布尔矩阵,使用函数num_of_name 显示关系。所以我写了我的函数:
let matrix =
let len = List.length defined + len_undefined in
let boolmat = Array.make_matrix len len false in
List.iter (fun (s, strs) ->
let pos1 = num_of_name defined undefined len_undefined s in
List.iter (fun t ->
let pos2 = num_of_name defined undefined len_undefined t in
boolmat.(pos1).(pos2) <- true) strs) entries;
boolmat
let print_mat m =
for i = 0 to Array.length m - 1 do
for j = 0 to Array.length m.(0) - 1 do
print_string (string_of_bool m.(i).(j));
Printf.printf " ";
done;
Printf.printf " \n";
done;
;;
let test_print = print_mat matrix
它返回一个错误“Fatal error: exception Not_found”
我需要你的帮助。 非常感谢!!
【问题讨论】:
-
你能解释一下你想做什么吗?
undefined和defined的作用是什么? -
真的吗?我尝试再次运行,它返回给我同样的错误。
-
未定义类型,因为在我的真实数据中,我没有定义描述这种类型。定义类型是我在数据中定义的类型。
-
您的
name_of_num函数未使用。你的测试代码在我的机器上运行良好。您确定您运行的是此处发布的相同代码吗? -
你是对的,name_of_num 是我试图显示它们的关系从 int -> string 和 string -> int 转换。我相信。我又跑了,但还是有问题。我添加了更多信息,解释了我想要的更多细节。
标签: ocaml