询问OCaml中的返回类型,列表和设置数据结构

时间:2011-12-06 10:01:50

标签: ocaml

我有一个函数计算列表到布尔矩阵,其中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 -> jj -> 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

感谢您的帮助。

0 个答案:

没有答案