У меня эта проблема до сих пор беспокоит меня много. У меня есть (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
"
Мне требуется ваша помощь. Большое Вам спасибо!!
undefined
иdefined
? - person pad   schedule 10.01.2012name_of_num
не используется. И ваш тестовый код отлично работает на моей машине. Вы уверены, что используете тот же код, что и здесь? - person pad   schedule 10.01.2012entries
есть строка, не принадлежащая ниdefined
, ниundefined
, возникает исключение. В противном случае ваш код правильный. - person pad   schedule 10.01.2012