2012-01-10 3 views
1

이 문제는 여전히 많은 문제가 있습니다. 내가 (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)에 에지를 갖는다 '등과 ...

I 이러한 기능을 가지고

는 목록 내의 위치 ( 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는"

나는 당신의 도움이 필요 오류를 반환합니다. 대단히 감사합니다 !!

+0

죄송합니다. 감사합니다 – Quyen

+0

당신이하고 싶은 것을 설명해 주시겠습니까? 'undefined'와'defined'의 역할은 무엇입니까? – pad

+0

정말요 ?? 나는 다시 달리려고 노력했다. 그리고 그것은 나에게 같은 오류를 돌려 준다. – Quyen

답변

1

내가 코멘트에 말했듯이 입력이 defined 또는 undefined 하나의 요소가 아닌 경우는 Not_found 예외가 발생하기 때문에, 당신의 num_of_name 기능은 쉽게 손상 될 수 있습니다.

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은 다음과 같이 계산된다 : 해결하는 한 가지 방법은 Option 유형 사용이 entries에서 definedundefined를 추출하여 프로그램을 실행하면, 물론

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 

를, 코드가 정확한지 확인하십시오.

관련 문제