[mercury-users] Mercury existential types / foreign code question
Peter Hawkins
peter at hawkins.emu.id.au
Mon Aug 1 17:53:31 AEST 2005
Hi...
Why doesn't this compile?
:- module test3.
:- interface.
:- import_module io.
:- pred main(io.state::di, io.state::uo) is det.
:- implementation.
:- import_module list.
:- import_module int.
% A type
:- type cvar(T) ---> cvar(v :: T, x :: list(int)).
:- inst cvar ---> cvar(ground, non_empty_list).
% A typeclass.
:- typeclass cvar_type(T) where [].
:- instance cvar_type(int) where [].
% Existential wrapper type
:- type cvar_wrapper ---> some [T] (
cvar_wrapper(cvar :: cvar(T)) => cvar_type(T)
).
% Wrap and unwrap predicates
:- func wrap_cvar(cvar(T)) = cvar_wrapper <= (cvar_type(T)).
:- some [T] func unwrap_cvar(cvar_wrapper::in) = (cvar(T)::out(cvar)) is det
=> (cvar_type(T)).
:- func unsafe_any_to_cvar(cvar(T)::ia) = (cvar(T)::out(cvar)) is det.
:- pragma foreign_proc("C", unsafe_any_to_cvar(X::ia) = (Y::out(cvar)),
[will_not_call_mercury, promise_pure], "Y = X;").
wrap_cvar(V) = 'new cvar_wrapper'(V).
unwrap_cvar(cvar_wrapper(V)) = unsafe_any_to_cvar(V).
main(!IO) :- io.print("Hello!\n", !IO).
I get this error:
test3.m:037: In clause for `unwrap_cvar(in) = out((test3.cvar))':
test3.m:037: in argument 1 of call to predicate
`private_builtin.type_info_from_typeclass_info/3':
test3.m:037: mode error: variable `TypeClassInfo_for_cvar_type' has
instantiatedness `free',
test3.m:037: expected instantiatedness was `ground'.
For more information, try recompiling with `-E'.
Any suggestions as to how to fix it? I can't see why this doesn't build,
since unsafe_any_to_cvar is universally quantified, so the typeclass
info should be communicated across.
In general what happens when you pass a polymorphic type to a
foreign_proc? How can you access the typeinfo?)
=)
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