Преобразование двоичного дерева в список с использованием функции fold в Ocaml

Дано:

type 'a tree = Empty | Node of 'a * 'a tree * 'a tree

Использовать:

let rec tree_fold  f e t = match t with
 | Empty -> e
 | Node (x, l, r) -> f x (tree_fold  f e l) (tree_fold  f e r);;

для преобразования двоичного дерева в список. Пример.

let someTree = Node (1,Node(2,Node(3,Empty,Empty),Empty),Empty)

tree2list someTree дает [1;2;3].

Моя попытка:

let tree2list  tr = match tr with
 | Empty -> Empty
 | Node (x,l,r) ->  (tree_fold (fun acc tree-> tree::acc) [] tr)

Это дает ошибку:

This expression has type 'a list but an expression was expected of type 'b -> 'b .

Я занимаюсь этим часами и продолжаю получать подобные ошибки. Любая помощь будет очень признательна, даже небольшой намек будет замечательным.

Спасибо.


person pumkpin    schedule 01.10.2014    source источник


Ответы (1)


Функция, которую вы должны передать tree_fold, принимает три аргумента, а вы передаете функцию, которая может принимать только два аргумента. Это то, что пытается сказать компилятор. Конечно, есть и другие проблемы, но я надеюсь, что вы с ними справитесь!

person ivg    schedule 02.10.2014