Вы хотите, чтобы ваш fork
был таким:
fork = \a left right -> 1 + left + right
Были две проблемы с вашей версией.Сначала вы вычисляете размер, а не складываете элементы дерева.Таким образом, вы не хотите добавлять это a
, это может быть даже не то, что вы можете добавить вообще.
fork = \a left right -> a+sizeBintree left+sizeBintree right
^
Во-вторых, посмотрите на тип вилки:
fork :: a -> val -> val -> val
он берет элемент дерева, затем два значения (не деревья!) И возвращает другое значение.Эти два значения будут результатами для свертывания левого и правого поддеревьев.
fork = \a left right -> a+sizeBintree left+sizeBintree right
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^
Примечание. Форк не должен выполнять какую-либо рекурсию.Схема рекурсии определяется как foldBin
.