[mercury-users] unresolved polymorphism in read_term_from_string
Julien Fischer
juliensf at csse.unimelb.edu.au
Mon Feb 13 12:26:06 AEDT 2012
On Sun, 12 Feb 2012, Jeff Thompson wrote:
> On 2/11/2012 9:52 PM, Julien Fischer wrote:
>>
>> Hi,
>>
>> On Sat, 11 Feb 2012, Jeff Thompson wrote:
>>
>>> Hello again. I've been working with the code parser, and gratified that
>>> it does what I expect. The code below correctly outputs "test". However,
>>> the predicate is declared as
>>> :- pred read_term_from_string(string::in, string::in, posn::out,
>>> read_term(T)::out) is det.
>>>
>>> and the compiler outputs the warning:
>>> test.m:004: In predicate `main'/2:
>>> test.m:004: warning: unresolved polymorphism.
>>> test.m:004: The variables with unbound types were:
>>> test.m:004: V_14: term.term(T)
>>> test.m:004: V_8: list.list(term.term(T))
>>> test.m:004: V_6: varset.varset(T)
>>> test.m:004: Term: term_io.read_term(T)
>>> test.m:004: The unbound type variables will be implicitly bound to the
>>> test.m:004: builtin type `void'.
>>>
>>> Do I need to bind the type T to `void' when calling read_term_from_string?
>>> If so, how?
>>
>> You can't, the compiler is telling you that that is what *it* is doing in
>> this case. It is doing that because it cannot infer a binding for the
>> type variable T. There are two things you can do about this:
>>
>> (1) ignore the issue by invoking mmc with the
>> --no-warn-unresolved-polymorphism option.
>>
>> (2) Provide some extra type information that allows the compiler to
>> infer a binding for T.
>>
>> In a bit more detail:
>>
>> The problem arises becuase the type of the 4th argument (Term) of the goal
>>
>> read_term_from_string("", "test.", _Posn, Term)
>>
>> is read_term(T). There is nothing else in the remainder of this program
>> that provides a binding for T.
>>
>> Solution (2) involves using the with_type operation, ':', to annotate
>> the 4th argument of read_term_from_string with enough type information
>> to allow the binding for T to be determined, for example,
>>
>> read_term_from_string("", "test.", _Posn, Term : read_term(generic))
>>
>> (generic/0 is defined in the term module.)
>
> Thank you for the detailed response. I suspected there was a way to provide
> the type information but couldn't find it in the language ref or examples.
Section 2.13.7 of th reference manual, ``Explicit type qualification''.
Julien.
--------------------------------------------------------------------------
mercury-users mailing list
Post messages to: mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions: mercury-users-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the users
mailing list