【问题标题】:Asking about return type, list and set data structure in OCaml (Cont.)在 OCaml 中询问返回类型、列表和集合数据结构(续)
【发布时间】:2011-12-12 22:54:09
【问题描述】:

感谢您从我之前的问题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 list list)。

但我还是卡住了。我需要你的帮助来解释我如何去思考这个问题。

感谢您的帮助, G

【问题讨论】:

    标签: list ocaml


    【解决方案1】:

    我不清楚你为什么在 print 函数内部使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-22
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多