0

私はこのコードを持っています:

datatype 'a tree = Leaf of 'a | Node of 'a * 'a tree * 'a tree | Nil;
val rec tree_sum = fn(f,e,Nil) => e 
                   | (f,e,Leaf(n)) => n 
                   | (f,e,Node(node,right,left)) =>     
                               f(node,tree_sum(f,e,right),tree_sum(f,e,left));

val binnum = Node(5,Leaf(4),Node(2,Leaf(1),Node(8,Nil,Nil)));
tree_sum((fn(a,b,c)=> a+b+c),0,binnum);
val it = 20 : int

treesum次のような別のデータ型がある場合、どうすれば同じ手順を実行できますか?

datatype 'a stree = Leaf of 'a | Brnch of 'a stree list;

treesum(fn(a, b) => a + b, 0, Brnch([Leaf 2, Brnch([Leaf 5, Leaf 3, Leaf 8])]));
val it = 18 : int

私は地図を使わなければならないと思います...私はこれを試しますが、3つのエラーがあります

val rec treesum = 
         fn (f,e,nil) => e 
            | (f,e,Leaf(n)) => n 
            | (f,e,Brnch(h::lst)) => 
                   f(treesum(f,e,h),treesum(f,e,lst));
4

1 に答える 1

1

あなたが間違ったことをした2つの場所があります。まず第一に、ではnilなくstreeBrnch nilですstree。第二に、lstはstreeではなくBrnch lst、ですstree。関数は次のように修正できます(読みやすくするためにケースを並べ替えます)。

val rec treesum = 
         fn (f,e,Leaf(n)) => n 
            | (f,e,Brnch nil) => e 
            | (f,e,Brnch(h::lst)) => 
                   f(treesum(f,e,h),treesum(f,e,Brnch lst));

もう1つ、データ型の構造に従って関数を作成する必要があります。したがって、List関数を使用する次のバージョンの方が優れています。

val rec treesum = 
         fn (f,e,Leaf(n)) => n 
            | (f,e,Brnch ls) => 
                   List.foldl (fn (l, acc) => f(treesum(f,e,l), acc)) e ls;
于 2011-05-30T07:24:08.993 に答える