debugging - 将一对 int 列表转换为 OCaml 中的 boolean 矩阵

标签 debugging matrix boolean ocaml

我有一个将 (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/

相关文章:

mysql - 如何找到拥有本地 Sleeping MySQL 连接的 Unix 进程?

c++ - 在 Debug模式下运行时 VS2012 中的命令参数错误

r - 如何在 R 中处理巨大的矩阵?

c++ - Bool 类型 True 和 False

java - 存储 boolean 值

swift - 向 uiview 添加约束时的 SIGABRT

Matlab 自定义 dbstop 处理程序

r - 如何使 R 矩阵填充函数更快?

matrix - 将梯形中的点位置转换为矩形位置

java - doubleX(String someString) 方法应根据输入字符串是否包含连续的 'x' 个字符返回 boolean 值