2016-02-09 70 views
1

我正在编写一个应该计算ocaml中给定树中节点数的程序。计算ocaml中树中的节点数

type 'a tree = Node of 'a * 'a tree list 

let count tree = 
    let rec visit node = 
     let (_,list_of_children) = node in 
     let rec help list1 = 
     match list1 with 
     | [] -> 0 
     | h::t -> (help t) + (visit h) in 
    (List.length list_of_children) + 1 + help list_of_children in 
    visit tree 

但是,代码不起作用。以下是编译器所说的内容:

File "liscie5.ml", line 10, characters 44-60: Error: This expression has type 'a list but an expression was expected of type ('b * 'a list) list

(Line 10: (List.length list_of_children) + 1 + help list_of_children in).

任何想法我的代码有什么问题?

+0

你应该学习和使用'List.fold_left'。我建议使用'List.fold_left'重新实现'List.length',然后修改它以解决您的问题。 –

回答

2

第一个问题,我看到的是:

let (_,list_of_children) = node in 

想必node'a tree类型。因此它看起来像Node (value, children)。但是这行代码将它视为一个通用的OCaml值对(a, b)。这将有助于代之以:

let Node (_,list_of_children) = node in 

有更简洁的方式来写这个,但它应该有助于取得一点进展。毫无疑问,还有其他(可能类似的)问题。