У меня есть индуктивное дерево типов, определенное следующим образом:
type 'a tree1 = Leaf of 'a
|Branch of 'a tree1 * 'a tree1
Я хочу иметь функцию, которая принимает это дерево в качестве входных данных, находит минимальное значение в этом дереве, удваивает его (давайте назовем результат как a), а затем воспроизводит другое дерево того же типа, которое все его листья заменены на.
У меня есть пара функций, которые помогут мне сделать это:
let rec findmin (mytree: int tree1) : int = match mytree with
|Leaf a -> a
|Branch(Leaf x, Leaf y) -> min x y
|Branch(left, right) -> min (findmin left) (findmin right)
let rec repdoublemin (mytree: int tree1) : int tree1 = match mytree with
|Leaf a -> Leaf (2*a)
|Branch(Leaf x, Leaf y) -> let result = 2 * findmin (Branch(Leaf x, Leaf y))
in Branch (Leaf result, Leaf result)
|Branch(left,right) -> Branch(repdoublemin left, repdoublemin right)
Мой результат не тот, который я ожидал.
repdoublemin Branch (Leaf 5, Branch (Leaf 3, Leaf 10));;
- : int tree1 = Branch (Leaf 10, Branch (Leaf 6, Leaf 6))
и я должен получить:
- : int tree1 = Branch (Leaf 6, Branch (Leaf 6, Leaf 6))