Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 询问OCaml中的返回类型、列表和设置数据结构(续)_List_Ocaml - Fatal编程技术网

List 询问OCaml中的返回类型、列表和设置数据结构(续)

List 询问OCaml中的返回类型、列表和设置数据结构(续),list,ocaml,List,Ocaml,谢谢你从我的上一个问题中给了我一个富有成效的回答。我还有一个问题与这个话题有关,但我认为用一个新问题提问是很好的 这里有一个函数(orderxsds),我用来计算和排序所有等价类。因为我想使用这个函数对数据进行排序,所以我将其转换为我的数据类型(我的数据是xsd类型) val展平:Xsd.Xsd列表->Xsd.Xsd列表 val transClosure : 'a array array -> 'a array array let name_of_num (l: 'a list) (i:

谢谢你从我的上一个问题中给了我一个富有成效的回答。我还有一个问题与这个话题有关,但我认为用一个新问题提问是很好的

这里有一个函数(
orderxsds
),我用来计算和排序所有等价类。因为我想使用这个函数对数据进行排序,所以我将其转换为我的数据类型(我的数据是xsd类型)

val展平:Xsd.Xsd列表->Xsd.Xsd列表

val transClosure : 'a array array -> 'a array array
let name_of_num (l: 'a list) (i: int) : 'a = List.nth l i;;
let order_xsds xsds =
    let flatten_xsds = flatten xsds in
    let xsds_matrix = matrix_of_dependencies flatten_xsds in
    let tc = transClosure xsds_matrix in
    let eq_classes_order = sort_eq_classes tc (eq_classes tc) in
    let xsds_of_ints = List.map (List.map (name_of_num flatten_xsds)) in
    let xsds_order = xsds_of_ints eq_classes_order in
    xsds_order;;
我正在尝试编写一个函数来打印排序列表的输出

val genr_type : Buffer.t -> Xsd.xsd -> unit
let rec genr_and_types b = function
  | [] -> ()
  | xsd :: xsds ->
    bprintf b "\n\nand %a%a" genr_type xsd genr_and_types 
     (List.flatten (order_xsds xsds));;

let genr_types b = function
    | [] -> assert false (* there is at least one builtin type *)
    | xsd :: xsds ->
      bprintf b "type %a%a" genr_type xsd genr_and_types 
    (List.flatten (order_xsds xsds))
我调用了
List.flatte
,只是为了修复OCaml检查的类型,但是我丢失了关于等价类排序的信息,这给了我一个错误的答案

我尝试使用list.iter nested获取xsds列表的另一个函数

let rec genr_types b xsds= List.iter (fun xsd -> 
  List.iter (fun xsds -> bprintf b "\n\nand %a%a" genr_type xsd 
    genr_types (order_xsds xsds)) xsds)(List.flatten xsds);; 
当我运行我的程序无法生成结果时,它看起来没有终止

我试图弄清楚如何打印函数“orderxsds”(val:Xsd.Xsd list->Xsd.Xsd list)的结果

但我仍然坚持。我需要你的帮助来解释如何解决这个问题

谢谢你的帮助,
G

我不清楚为什么要在打印功能的深处使用
orderxsds

如果我猜对了(但我可能错了,因为我不明白您要解决的问题),您需要首先生成要打印的数据,然后尝试打印它。例如,您的打印功能可以是:

let rec genr_types b (xsds_partition : Xsd.xsd list list) =
  List.iter (function
    | []   -> ()
    | h::t ->
      bprintf "type %a" genr_type h;
      List.iter (fun xsd -> bprintf b "\n\nand %a" genr_type xsd) t
  ) xsds_partition
您可以稍后再打电话:

let print_partitions b xsds = genr_types b (order_xsds xsds)