Кажется, что f
- это трехпараметрическая функция сокращения, a
- нейтральный элемент нашего сокращения, а t
- корень, поэтому:
с учетом двоичного типа (я не очень хорошо помню синтаксис вариантов типов, поэтому, пожалуйста, будьте снисходительны здесь)
let r = Node(Node(Node(Leaf,3,Leaf),2,Node(Leaf,4,Leaf)),1,Node(Node(Leaf,6,Leaf),5,Node(Leaf,7,Leaf)))
если вы хотите суммировать все узлы, функция будет вызываться следующим образом:
let add x y z = x + y + z
fold_tree add 0 r
и мы получим t
в качестве узла, поэтому имеем:
(add 1 (fold_tree add 0 Node(Node(Leaf,3,Leaf),2,Node(Leaf,4,Leaf))) (fold_tree add 0 Node(Node(Leaf,6,Leaf),5,Node(Leaf,7,Leaf))))
если мы немного расширим его, мы получим:
(add 1 (add 2 (fold_tree add 0 Node(Leaf,3,Leaf)) (fold_tree add 0 Node(Leaf,4,Leaf))) (add 5 (fold_tree add 0 Node(Leaf,6,Leaf)) (fold_tree add 0 Node(Leaf,7,Leaf))))
и еще раз, мы сопоставляем листья:
(add 1 (add 2 (add 3 0 0) (add 4 0 0)) (add 5 (add 6 0 0) (add 7 0 0))
(add 1 (add 2 3 4) (add 5 6 7))
(add 1 9 18)
чтобы наконец получить:
28
Надеюсь, это поможет.