Ошибка при преобразовании в булеву матрицу - PullRequest
1 голос
/ 10 января 2012

У меня эта проблема все еще беспокоит меня. У меня есть (string * string list) list, и я хочу преобразовать его в логическую матрицу.

У меня есть особые условия, когда его трансформируют. Например, у меня есть этот список:

let entries = [("name", ["string"; "label"]); ("label", ["int"; "name"]); 
               ("symbol", ["string"])]

, где "string" и "int" - неопределенный тип, неопределенный тип, потому что в моих реальных данных у меня нет определения, описывающего этот тип. Поэтому я построил список неопределенного типа.

let undefined = ["string"; "int"]

И первая позиция в списке ("name", "label", "symbol") - это определенный тип, определенный тип - это тип, который у меня есть в моих данных.

let defined = ["name"; "label"; "symbol"]

Я пытаюсь сделать это: начиная с entries, позиция должна быть:

name: 2; string: 0; label: 3; int: 1; symbol: 4

А при отображении зависимого отношения из списка entries оно не меняет их положение. Например: name(2) ссылка на string(0) и label(3), а label (3) имеет ребро на int(1) и name (2), `и т. Д. *

У меня есть эти функции, возвращающие позицию (num_of_name) и элемент (name_of_num) в списке.

let rec position x = function
| [] -> raise Not_found
| y :: ys -> if x = y then 0 else 1 + position x ys

let len_undefined = List.length undefined

let num_of_name defined undefined len_undefined s =
  try (position s defined) + len_undefined;
  with Not_found -> position s undefined

let name_of_num defined undefined len_undefined k =
  if k < len_undefined then
    List.nth undefined k else
    List.nth defined (k - len_undefined)

Итак, из списка entries я хочу построить булеву матрицу, чтобы показать связь с помощью функции num_of_name. Поэтому я пишу свою функцию:

let matrix =
  let len = List.length defined + len_undefined in
  let boolmat = Array.make_matrix len len false in
  List.iter (fun (s, strs) ->
    let pos1 = num_of_name defined undefined len_undefined s in
      List.iter (fun t ->
    let pos2 = num_of_name defined undefined len_undefined t in
    boolmat.(pos1).(pos2) <- true) strs) entries;
    boolmat

let print_mat m =
  for i = 0 to Array.length m - 1 do
    for j = 0 to Array.length m.(0) - 1 do
      print_string (string_of_bool m.(i).(j));
      Printf.printf " ";
    done;
    Printf.printf " \n";
  done;
;;

let test_print = print_mat matrix

Возвращает ошибку "Fatal error: exception Not_found"

Мне нужна твоя помощь. Большое спасибо !!

1 Ответ

1 голос
/ 10 января 2012

Как я уже сказал в комментарии, ваша функция num_of_name хрупка, так как она генерирует исключение Not_found, когда ее ввод не является элементом defined или undefined. Один из способов исправить это использовать Option type:

let num_of_name defined undefined len_undefined s =
  try 
      let p = position s defined in
      Some (p + len_undefined)
  with Not_found -> 
     try
       let p = position s undefined in
       Some p
     with Not_found -> None

и matrix рассчитывается как:

let matrix =
  let len = List.length defined + len_undefined in
  let boolmat = Array.make_matrix len len false in
  List.iter (fun (s, strs) ->
    match num_of_name defined undefined len_undefined s with
    | Some pos1 -> List.iter (fun t ->
                      match num_of_name defined undefined len_undefined t with
                      | Some pos2 -> boolmat.(pos1).(pos2) <- true
                      | None -> ()) strs
    | None -> ()
      ) entries; 
  boolmat

Конечно, если вы реализуете свою программу, извлекая defined и undefined из entries, ваш код верен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...