【问题标题】:Error when convert to Boolean matrix转换为布尔矩阵时出错
【发布时间】: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

我需要你的帮助。 非常感谢!!

【问题讨论】:

  • 你能解释一下你想做什么吗? undefineddefined的作用是什么?
  • 真的吗?我尝试再次运行,它返回给我同样的错误。
  • 未定义类型,因为在我的真实数据中,我没有定义描述这种类型。定义类型是我在数据中定义的类型。
  • 您的name_of_num 函数未使用。你的测试代码在我的机器上运行良好。您确定您运行的是此处发布的相同代码吗?
  • 你是对的,name_of_num 是我试图显示它们的关系从 int -> string 和 string -> int 转换。我相信。我又跑了,但还是有问题。我添加了更多信息,解释了我想要的更多细节。

标签: ocaml


【解决方案1】:

正如我在评论中所说,您的num_of_name 函数很脆弱,因为当它的输入不是definedundefined 的元素时,它会抛出Not_found 异常。一种解决方法是使用Option 类型:

let num_of_name defined undefined len_undefined s =
  try 
      let p = position s defined in
      Some (p + len_undefined)
  with Not_found -> 
     try
       let p = position s undefined in
       Some p
     with Not_found -> None

matrix 计算为:

let matrix =
  let len = List.length defined + len_undefined in
  let boolmat = Array.make_matrix len len false in
  List.iter (fun (s, strs) ->
    match num_of_name defined undefined len_undefined s with
    | Some pos1 -> List.iter (fun t ->
                      match num_of_name defined undefined len_undefined t with
                      | Some pos2 -> boolmat.(pos1).(pos2) <- true
                      | None -> ()) strs
    | None -> ()
      ) entries; 
  boolmat

当然,如果您通过从entries 中提取definedundefined 来强制执行您的程序,那么您的代码是正确的。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多