%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%

:- module mpj3.
:- interface.

:- typeclass coll(E, C) <= (C -> E) where [
    func i(E, C) = C
].

:- type intlist
    --->    []
    ;       [int | intlist].
:- type stringlist
    --->    []
    ;       [string | stringlist].

:- func g(intlist) = intlist.

:- implementation.

    % Error: overlapping instances:
    %
:- instance coll(int, intlist) where [ (i(N, L) = [N | L]) ].
:- instance coll(string, stringlist) where [ (i(S, L) = [S | L]) ].
:- instance coll(string, intlist) where [ (i(_S, L) = [1 | L]) ].

    % Error: conflicting types for args 1 and 2, both of which are
    % determined by the type of L.
    %
g(L) = f(1, "foo", L).

    % This probably should be an error, or at least a warning, since the
    % constraints could be tighter.
    %
:- func f(A, B, C) = C <= (coll(A, C), coll(B, C)).

f(A, B, C) = i(A, i(B, C)).
