私はデータ構造を持っています、
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
しかし、最後のケースでは必然的に 2 つの分岐があるため、これは末尾再帰関数ではありません。
型シグネチャの展開が許可されている場合、それを作成することは可能ですか?また、どのような費用がかかりますか? また、試してみる価値があるかどうかも疑問です。つまり、実際に速度が向上しますか?