Flatten a list: Difference between revisions

Add Mercury.
(Add Mercury.)
Line 1,641:
<lang maxima>flatten([[[1, 2, 3], 4, [5, [6, 7]], 8], [[9, 10], 11], 12]);
/* [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] */</lang>
 
=={{header|Mercury}}==
As with Haskell we need to use an algebraic data type.
<lang mercury>:- 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.
</lang>
{{out}}
<pre>
[1, 2, 3, 4, 5, 6, 7, 8]
</pre>
 
=={{header|Mirah}}==
Anonymous user