Files
mercury/tests/invalid/mpj_3.m
2024-05-30 20:42:34 +10:00

40 lines
1.0 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module mpj_3.
:- 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)).