感谢您从上一个问题Asking about return type, list and set data structure in OCaml得到的非常有成效的答案。我有另一个与此主题相关的问题,但我认为在一个新问题中提出问题是好的。
这是一个函数(order_xsds
)我用来计算和排序所有等价类。因为我想使用此函数对数据进行排序,所以我将其传输到我的数据类型(我的数据是xsd类型)。
val flatten : Xsd.xsd list -> Xsd.xsd list
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.flatten
只是因为修复了OCaml检查的类型,但是我丢失了关于等价类排序的信息,它给出了错误的答案。
我尝试使用List.iter嵌套获取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);;
当我运行程序时无法生成结果,看起来它不会终止。
我试图找出如何从函数“order_xsds”打印结果(val:Xsd.xsd list - > Xsd.xsd列表列表)。
但我仍然坚持。我需要你的帮助来解释我如何去思考这个问题。
感谢您的帮助, ģ
答案 0 :(得分:2)
我不清楚为什么你在打印功能中使用order_xsds
。
如果我猜对了(但我可能错了,因为我不明白你要解决的问题),你需要先生成你想要打印的数据,然后尝试打印它。例如,您的打印功能可能类似于:
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)