RosettaCodeData/Task/Flatten-a-list/Mercury/flatten-a-list.mercury
2015-02-20 00:35:01 -05:00

34 lines
653 B
Text

:- module flatten_a_list.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module list.
:- type tree(T)
---> leaf(T)
; node(list(tree(T))).
:- func flatten(tree(T)) = list(T).
flatten(leaf(X)) = [X].
flatten(node(Xs)) = condense(map(flatten, Xs)).
main(!IO) :-
List = node([
node([leaf(1)]),
leaf(2),
node([node([leaf(3), leaf(4)]), leaf(5)]),
node([node([node([])])]),
node([node([node([leaf(6)])])]),
leaf(7),
leaf(8),
node([])
]),
io.print_line(flatten(List), !IO).
:- end_module flatten_a_list.