2015-01-18 1 views
1

정상 나무에 대한 참조로 나무를 변환 :OCaml이 나는 나무의 2 종류를 가지고

내가 그들을 포함 된 목록에 대한 참조로 저장 이웃과 나무를 가져오고를 출력하는 기능 convert: ref_tree -> tree를 작성하려면
type ref_tree = Node of int * ref_tree list ref 
type tree = Node of int * tree list 

트리에서 참조가 일반 목록으로 변경됩니다.

let rec convert t = 
     match t with 
     | Node (x, l) -> 
      if (!l = []) then Node (x, []) else 
      Node (x, (List.map convert !l)) 

을하지만, 컴파일 할 때 OCaml의 오류를 반환 : 여기에 내가 시도 무엇

if (!l = []) then Node (x, []) else 
Error: This expression has type 'a list 
     but an expression was expected of type tree list ref 

경우 Node (x, []) 빈 내부 목록에서 This expression 점. 왜 형식 불일치가 있습니까?

답변

2

여기서 문제는 당신이 첫 번째 섀도 잉 두 번째 정의 (type tree = Node of …)로,이 생성자 Node를 정의하는 것입니다.

t에 대해 일치와 Node(x, l)로 destructuring 때, OCaml의이 tree 아닌 ref_tree으로이 보는 것을 의미한다 (그리고 결과적으로 대신 ref_tree list reftree listl보고)

# type ref_tree = Ref_node of int * ref_tree list ref;; 
type ref_tree = Ref_node of int * ref_tree list ref 

# let rec convert t = 
      match t with 
      | Ref_node (x, l) -> 
       if (!l = []) then Node (x, []) else 
       Node (x, (List.map convert !l));; 
val convert : ref_tree -> tree = <fun> 

(또 다른 방법은 모듈을에서 그 유형을 정의하는 것입니다 :이 문제를 해결하는 한 가지 방법은 ref_tree 생성자를 변경하는 것입니다및 RefTree이고 Tree.NodeRefTree.Node을 사용)

1

Node 생성자 (ref_tree 중 하나와 tree 중 하나)간에 컴파일러가 혼동을 일으 킵니다. 당신은 다음과 같은 다양한 방법으로 그것을 도울 수 :

let rec convert t = 
    match (t : ref_tree) with 
    | Node (x, l) -> 
    if (!l = []) then Node (x, []) else 
     Node (x, (List.map convert !l)) 
관련 문제