【问题标题】:How to make this ml procedure如何制作这个 ml 程序
【发布时间】:2011-09-04 13:18:37
【问题描述】:

我有这个代码:

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));

【问题讨论】:

    标签: tree sml ml


    【解决方案1】:

    有两个地方你做错了。首先,nil 不是stree,而是Brnch nilstree。其次,lst 不是街道,但Brnch lststree。您的函数可以按如下方式进行更正(为了便于阅读,我重新排序了案例):

    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));
    

    还有一点,你应该按照数据类型的结构来编写你的函数。所以下面使用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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多