declare % FoldTree: % }: S> % S % }: S> fun {FoldTree T Fun Z} case T of leaf then Z [] tree(key: L value: V left: Left right: Right) then {Fun L V {FoldTree Left Fun Z} {FoldTree Right Fun Z} } end end fun {FoldTreeMaker Fun Z} fun {$ T} {FoldTree T Fun Z} end end fun {Preorder T} {FoldTree T fun {$ L V LeftRes RightRes} (L#V)|{Append LeftRes RightRes} end nil} end Preorder2 = {FoldTreeMaker fun {$ L V LeftRes RightRes} (L#V)|{Append LeftRes RightRes} end nil} fun {IncTree T} {FoldTree T fun {$ L V LeftRes RightRes} tree(key: L value: V+1 left: LeftRes right: RightRes) end leaf} end