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转换。我确定。我又跑了,但还是有问题。我添加了更多信息,解释了我想要的更多细节。