Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sml 我想用标准ML制作函数maptree_Sml_Smlnj - Fatal编程技术网

Sml 我想用标准ML制作函数maptree

Sml 我想用标准ML制作函数maptree,sml,smlnj,Sml,Smlnj,我想用标准ML制作函数maptree。 如果函数f(x)=x+1; 然后 应该有结果 NODE(NODE(LEAF 2,LEAF 3),LEAF 4)) 我像下面这样编写代码 datatype 'a tree = LEAF of 'a | NODE of 'a tree * 'a tree; fun f(x) = x + 1; fun maptree(f, NODE(X, Y)) = NODE(maptree(f, X), maptree(f, Y)) | maptree(f, LEAF(X)

我想用标准ML制作函数maptree。 如果函数f(x)=x+1; 然后

应该有结果

NODE(NODE(LEAF 2,LEAF 3),LEAF 4))
我像下面这样编写代码

datatype 'a tree = LEAF of 'a | NODE of 'a tree * 'a tree;
fun f(x) = x + 1;
fun maptree(f, NODE(X, Y)) = NODE(maptree(f, X), maptree(f, Y))
| maptree(f, LEAF(X)) = LEAF(f X);
但是当我像这样执行代码时

maptree(f, (NODE(NODE(LEAF 1,LEAF 2),LEAF 3)));
结果不是我想要的 (节点(节点(叶2、叶3、叶4))) 但是 节点(节点(叶#,叶#),叶4))。 为什么会发生这种情况(不是数字而是#)?

当REPL打印的数据结构深度超过预设值时,REPL会使用它。如果你增加这个值,你会得到你期望的结果。我假设您使用的是SML/NJ,它调用该设置
print.depth

sml -Cprint.depth=20
- maptree(f, (NODE(NODE(LEAF 1,LEAF 2),LEAF 3)));
val it = NODE (NODE (LEAF 2,LEAF 3),LEAF 4) : int tree
通过执行
sml-H
,您可以找到更多类似的选项。在“编译器打印设置”部分中查找它们:

一些评论:

  • 我可能会同意这个定义

    datatype 'a tree = Leaf | Node of 'a tree * 'a * 'a tree
    
    因此,也可以表示具有零或两个元素的树

  • 我可能会使用树映射函数

    fun treemap f Leaf = Leaf
      | treemap f (Node (l, x, r)) = Node (treemap f l, x, treemap f r)
    
    因为您可以部分应用它,例如:

    (* 'abstree t' returns t where all numbers are made positive *)
    val abstree = treemap Int.abs
    
    (* 'makeFullTree n' returns a full binary tree of size n *)
    fun makeFullTree 0 = Leaf
      | makeFullTree n =
        let val subtree = makeFullTree (n-1)
        in Node (subtree, n, subtree)
        end
    
    (* 'treetree t' makes an int tree into a tree of full trees! *)
    val treetree = treemap makeFullTree
    
  • 在某个时候,你也可能想要

  • fun treemap f Leaf = Leaf
      | treemap f (Node (l, x, r)) = Node (treemap f l, x, treemap f r)
    
    (* 'abstree t' returns t where all numbers are made positive *)
    val abstree = treemap Int.abs
    
    (* 'makeFullTree n' returns a full binary tree of size n *)
    fun makeFullTree 0 = Leaf
      | makeFullTree n =
        let val subtree = makeFullTree (n-1)
        in Node (subtree, n, subtree)
        end
    
    (* 'treetree t' makes an int tree into a tree of full trees! *)
    val treetree = treemap makeFullTree