Ваша проблема в том, что вы применяете функцию к 3 аргументам. Первый параметр в сигнатуре типа говорит сам за себя.
fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
(+) принимает только 2 аргумента, но когда вы передаете его, он пытается оценить это:
(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P
Вы, вероятно, хотите сложить с помощью двоичной функции (a -> a -> a). Предположим, вы хотите использовать (+). Вы хотите, чтобы результат был таким:
fold f z (Node x l r) = x + (fold f z l) + (fold f z r)
Отсюда легко обобщить: просто замените +
на инфиксированный f
fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)