Запрос о типе возврата, списке и настройке структуры данных в OCaml (продолжение) - PullRequest
1 голос
/ 13 декабря 2011

Спасибо за очень плодотворный ответ, который я получил от моего предыдущего вопроса На вопрос о типе возврата, списке и структуре данных в 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, но я теряю информацию о отсортированных классах эквивалентности, что дает мне неправильный ответ.

Я попробовал другую функцию, берущую список списков xsds, используя вложенный List.iter.

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 -> список Xsd.xsd).

Но я все еще застрял. Мне нужна твоя помощь, чтобы объяснить мне, как идти с этой проблемой.

Спасибо за вашу помощь, G

1 Ответ

2 голосов
/ 13 декабря 2011

Мне не понятно, почему вы используете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...