我有一个函数计算列表到布尔矩阵,其中num_of_name: 'a list -> 'a -> int
:返回列表中元素的位置。
1)我想要mat_of_dep_rel : 'a list -> bool array array.
我的问题是,从第一个List.iter
开始,它应该采用列表l
而不是空列表[]
。但是如果我返回l
而不是[]
,它会给我一个类型:('a * 'a list) list -> boolean array array.
这不是我想要的。
我想知道如何返回mat_of_dep_rel: 'a list -> bool array array?
let mat_of_dep_rel l =
let n = List.length l in
let m = Array.make_matrix n n false in
List.iter (fun (s, ss) ->
let i = num_of_name ss s in
List.iter (fun t ->
m.(i).( num_of_name ss t) <- true) ss) [];
m;;
2)我有另一个函数计算等价类,以计算等价类:检查元素i是否有路径i -> j
和j -> i
或它自己。我希望它为我返回int list list
类型。在此代码中,我通过将'list list
放入j
来强制返回类型[j].
我的问题是:
如果我这样强迫它是否正确?如果不是,我怎么能返回我想要的类型int list list.
let eq_class m i =
let mi = m.(i) in
let aux =
List.fold_right (fun j l ->
if j = i || mi.(j) && m.(j).(i) then
[j] :: l else l) in
aux [] [];;
另一个函数eq_classes通过收集所有等价类来计算一组等价类。我想使用列表数据结构而不是使用集合。但就目前而言,我对这里的代码并不是很了解。
你可以帮我解释一下吗?如果我想使用列表数据结构,我该如何使用它? OCaml中的列表和集合数据结构有什么不同?推进/摒弃它?let eq_classes m =
IntSet.fold (fun i l -> IntMap.add i (eq_class m i) l)
IntSet.empty IntMap.empty;;
3)我的最后一个问题是。在拥有所有等价类之后,我想对它们进行排序。我还有其他功能
let cmp m i j = if eq_class m i = eq_class m j then 0
else if m.(i).(j) then -1 else 1;;
let eq_classes_sort m l = List.sort (cmp m) l;;
我希望它返回给我的最后一个函数b ool array array -> int list list
而不是bool array array -> int list -> int list
感谢您的帮助。