Ocaml 转换为布尔矩阵时出错

Ocaml 转换为布尔矩阵时出错,ocaml,Ocaml,我有这个问题仍然困扰着我很多。我有一个(字符串*字符串列表)列表,我想将其转换为布尔矩阵 我在变换它时有一个特殊的条件。例如,我有以下列表: let entries = [("name", ["string"; "label"]); ("label", ["int"; "name"]); ("symbol", ["string"])] 其中“string”和“int”是未定义类型,未定义类型,因为在我的实际数据中,我没有描述这种类型的定义。所以我建立了一个未定义

我有这个问题仍然困扰着我很多。我有一个
(字符串*字符串列表)列表
,我想将其转换为布尔矩阵

我在变换它时有一个特殊的条件。例如,我有以下列表:

let entries = [("name", ["string"; "label"]); ("label", ["int"; "name"]); 
               ("symbol", ["string"])]

其中“
string
”和“
int
”是未定义类型,未定义类型,因为在我的实际数据中,我没有描述这种类型的定义。所以我建立了一个未定义类型的列表

let undefined = ["string"; "int"]
列表中的第一个位置(“
名称
”、“
标签
”、“
符号
”)是定义类型,定义类型是我在数据中定义的类型

let defined = ["name"; "label"; "symbol"]
我正在尝试这样做:从
条目中,应该有以下位置:

name: 2; string: 0; label: 3; int: 1; symbol: 4
当显示列表
条目
中的依赖关系时,它不会改变它们的位置。例如:
name(2)
链接到
string(0)
label(3)
label(3)
有一个到
int(1)
name(2)
的边,`等等

我让这些函数返回列表中的位置(
num\u of_name
)和元素(
name\u 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)
它返回一个错误“
致命错误:未找到异常”

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

正如我在评论中所说,您的
num\u of_name
函数是脆弱的,因为当其输入不是
已定义的
未定义的
元素时,它会抛出
未找到的
异常。一种修复方法是使用
选项
类型:

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
矩阵
的计算公式为:

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
let矩阵=
设len=List.length defined+len_undefined in
设boolmat=Array.make_矩阵len len在
List.iter(乐趣(s、STR)->
将定义的\u名称的数量\u未定义的长度\u未定义的与匹配
|一些pos1->List.iter(乐趣t->
将定义的\u名称的num\u未定义的len\u未定义的t与匹配
|一些pos2->boolmat.(pos1)。(pos2)()STR
|无->()
)参赛作品;
布尔马特

当然,如果您通过从
条目
中提取
已定义的
未定义的
来执行程序,那么您的代码是正确的。

正如我在评论中所说,您的
num\u of_name
函数是脆弱的,因为当其输入不是
defined
undefined
的元素时,它会引发
Not\u found
异常。一种修复方法是使用
选项
类型:

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
矩阵
的计算公式为:

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
let矩阵=
设len=List.length defined+len_undefined in
设boolmat=Array.make_矩阵len len在
List.iter(乐趣(s、STR)->
将定义的\u名称的数量\u未定义的长度\u未定义的与匹配
|一些pos1->List.iter(乐趣t->
将定义的\u名称的num\u未定义的len\u未定义的t与匹配
|一些pos2->boolmat.(pos1)。(pos2)()STR
|无->()
)参赛作品;
布尔马特

当然,如果您通过从
条目
中提取
已定义的
未定义的
来执行您的程序,那么您的代码是正确的。

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