[m-users.] Unintelligible compiler message

Zoltan Somogyi zoltan.somogyi at runbox.com
Tue Mar 12 00:23:06 AEDT 2019



On Sun, 10 Mar 2019 23:59:26 +0100, Volker Wysk <post at volker-wysk.de> wrote:

> Hi
> 
> I try to compile this little program:
> 
> :- module test1.
> :- interface.
> :- import_module io.
> :- pred main(io::di, io::uo) is det.
> :- implementation.
> :- import_module list, char, string.
> main(!IO) :-
>     list.map(string.to_char_list, ["abc", "def"], Liste).
> 
> And get this error message from the compiler:
> 
> test1.m:010: In clause for `main(di, uo)':
> test1.m:010:   mode error in conjunction. The next 2 error messages indicate
> test1.m:010:   possible causes of this error.
> test1.m:010:   In clause for `main(di, uo)':
> test1.m:010:   in call to predicate `list.map'/3:
> test1.m:010:   mode error: arguments
> test1.m:010:   `TypeCtorInfo_15, TypeInfo_16, V_7, V_8, Liste' have the
> test1.m:010:   following insts:
> test1.m:010:     unique(<type_ctor_info for .string/0>),
> test1.m:010:     bound(
> test1.m:010:       type_info(
> test1.m:010:         bound(
> test1.m:010:           <type_ctor_info for list.list/1>
> test1.m:010:         ),
> test1.m:010:         bound(
> test1.m:010:           <type_ctor_info for .character/0>
> test1.m:010:         )
> test1.m:010:       )
> test1.m:010:     ),
> test1.m:010:     free,
> test1.m:010:     unique,
> test1.m:010:     free
> test1.m:010:   which does not match any of the modes for predicate
> test1.m:010:   `list.map'/3.
> test1.m:010:   In clause for `main(di, uo)':
> test1.m:010:   in argument 1 of call to predicate `list.map'/3:
> test1.m:010:   mode error in unification of `V_7' and higher-order term based
> test1.m:010:   on multi-moded predicate `string.to_char_list'/2.
> test1.m:010:   The modes of the argument variables match more than one of the
> test1.m:010:   called predicate's modes.
> 
> I half-understand that message. But what I don't understand is, why does it 
> mention five arguments (`TypeCtorInfo_15, TypeInfo_16, V_7, V_8, Liste') to 
> the call of list.map? There are only three!

The two extra arguments come from the fact that the type signature of list.map
contains two type variables. The caller passes along an extra argument for
each such type variable, telling the callee the identity of the types bound to those
type variables.

> I'd like to understand that error message. Could anyone point me at how to 
> find it in the documentation?

It is not in the documentation, because it is the kind of internal detail
that users shouldn't have to concern themselves with.

I will look into modifying the error message to remove the cause
of the confusion.

Zoltan.


More information about the users mailing list