Sml 我想用标准ML制作函数maptree
我想用标准ML制作函数maptree。 如果函数f(x)=x+1; 然后 应该有结果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)
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