我有一个数据结构,
datatype 'a tree = Leaf | Branch of 'a tree * 'a * 'a tree
我想编写一个以某种顺序遍历这棵树的函数。它做什么都没关系,所以它可能是一个treefold : ('a * 'b -> 'b) -> 'b -> 'a tree -> 'b
. 我可以这样写这个函数:
fun treefold f acc1 Leaf = acc1
| treefold f acc1 (Branch (left, a, right)) =
let val acc2 = treefold f acc1 left
val acc3 = f (a, acc2)
val acc4 = treefold f acc3 right
in acc4 end
但是因为我在最后一种情况下不可避免地有两个分支,所以这不是尾递归函数。
如果允许扩展类型签名,是否可以创建一个,并且成本是多少?我也想知道它是否值得尝试;也就是说,它在实践中是否会带来任何速度优势?