我有一个将 (int * int list) list
转换为 boolean 矩阵的函数。我用我的反例进行了测试,它给了我一个正确的答案。就像下面的代码。
let to_matrix l =
let n = List.length l in
let m = Array.make_matrix (n + 1) (n + 1) false in
List.iter (fun (i, j) ->
List.iter (fun t ->
m.(i).(t) <- true) j) l;
m;;
let ex = to_matrix [(0, [1; 0]); (1, [0]); (2, [1])];;
它给了我一个矩阵:
true true false false
true false false false
false true false false
false false false false
我必须在我的真实数据中测试它,它是一个 xsds 列表,如下面的数据脚本。例如:
[Elt ("name", Some (SimpleType "string"), 1, Bound 1);
Group ("label",
Some
(Choice
[Elt ("numberLabel",
Some
(Sequence
[Elt ("number", Some (SimpleType "nonNegativeInteger"), 0,
Unbounded)]),
1, Bound 1);
Elt ("symbolLabel",
Some (Sequence [GroupRef ("name", 0, Unbounded)]), 1, Bound 1)]),
1, Bound 1)]
编辑:
感谢 Thomas 的回答。
我错过了关于我从遍历这些树返回的类型的解释。
遍历后的类型如下列表:
[("姓名"; ["字符串"]); ("label"; ["nonNegativeInteger"; "name"])...]
从这个 xsds 列表中,我想表示一个 boolean 矩阵以显示它们之间的依赖关系,例如:类型名称取决于类型字符串;类型 标签取决于类型 nonNegativeInteger 和名称。
最佳答案
to_matrix
函数错误。
用to_matrix [(0, [2])];;
测试一下就可以看到了
为了让它工作,您需要找到一种方法将列表的 'a
映射到 [0..(n-1)]
,其中n
是列表中出现的元素数。
它使用关联列表的一种可能方式:
let mapping = ref []
let int_of_a a =
if List.mem_assq a !mapping then
List.assq a !mapping
else
let n = List.length !mapping in
mapping := (a, n) :: !mapping;
n
并将您的 to_matrix
函数更改为:
let to_matrix l =
(* step 1: registering your inputs *)
mapping := [];
let register i = ignore (int_of_a i) in
List.iter (fun (i, j) ->
register i;
List.iter register j
) l;
let n = List.length !mapping in
(* step 2: creating and populating your matrix *)
let m = Array.make_matrix n n false in
List.iter (fun (i, j) ->
List.iter (fun t ->
m.(int_of_a i).(int_of_a t) <- true
) j
) l;
m;;
这显然不是编写此类内容的最佳方式,但您明白了。
关于debugging - 将一对 int 列表转换为 OCaml 中的 boolean 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8601694/