[mercury-users] Mode polymorphism
Peter Hawkins
peter at hawkins.emu.id.au
Fri Jul 29 10:48:41 AEST 2005
Hi...
Why doesn't this work?
:- module test2.
:- interface.
:- import_module io.
:- pred main(io.state::di, io.state::uo) is det.
:- implementation.
:- import_module list.
% Version of map with mode polymorphism
:- func map_poly(func(T1) = T2, list(T1)) = list(T2).
:- mode map_poly((func(in(I)) = (out(O)) is det), in(list(I))) =
out(list(O))
is det.
map_poly(_Func, []) = [].
map_poly(Func, [X|Xs]) = [Y|Ys] :-
Y = apply(Func, X),
Ys = map_poly(Func, Xs).
:- func get_list = (list(list(int))::out(list(non_empty_list))) is det.
get_list = [[1],[2]].
:- func do_something(list(int)::in(non_empty_list)) =
(list(int)::out(non_empty_list)) is det.
do_something(X) = X.
:- pred print_non_empty_list(list(list(int))::in(list(non_empty_list)),
io.state::di, io.state::uo) is det.
print_non_empty_list([], !IO).
print_non_empty_list([X|Xs], !IO) :-
io.print(X, !IO),
io.nl(!IO),
print_non_empty_list(Xs, !IO).
main(!IO) :-
X = get_list,
Y = map(do_something, X),
print_non_empty_list(Y, !IO),
true.
I get this error message:
$ mmc --make test2
Making Mercury/int3s/test2.int3
Making Mercury/cs/test2.c
test2.m:038: In clause for `main(di, uo)':
test2.m:038: in argument 1 of call to predicate
`test2.print_non_empty_list/3':
test2.m:038: mode error: variable `Y' has instantiatedness `ground',
test2.m:038: expected instantiatedness was `bound((list.[]) ;
list.'[|]'(bound(list.'[|]'(ground, ground)), ...))'.
For more information, try recompiling with `-E'.
** Error making `Mercury/cs/test2.c'.
=)
Peter
--------------------------------------------------------------------------
mercury-users mailing list
post: mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the users
mailing list