[Haskell-cafe] Wincomplete-uni-patterns and bidirectional patterns

Viktor Dukhovni ietf-dane at dukhovni.org
Tue Jan 16 15:34:46 UTC 2024


On Tue, Jan 16, 2024 at 04:16:26PM +0100, Olaf Klinke wrote:

> I don't think the number of constructors/patterns is the issue. 
> Likely the problem lies in the fact that while ordinary constructors
> make up disjoint subsets of the type, with patterns you can define
> overlapping sets, which makes completeness checks much more
> complicated. 
> Hence I believe that completeness checks in presence of patterns is
> equivalent to determine whether a disjunction of logic formulae, which
> are possibly self-referential, is a tautology. That may well be semi-
> decidable at best. 

That seems plausible, but I think that interface stability is a more
serious concern.  It isn't enough to know that *as-implemented* at a
given time some particular set of patterns is complete.

The implementation of a set of patterns (or the underlying type) can
change in a manner that changes complete <-> incomplete in either
direction.  Such changes are non-breaking, provided there was no
"contract" (COMPLETE pragma) that the patterns are *intended* to be
complete.

Initially:

    data Foo = A | B
    pattern Good :: Foo; pattern Good = Foo A
    pattern Bad  :: Foo; pattern Bad  = Foo B

Later:

    data Foo = A | B | C
    pattern Good :: Foo; pattern Good = Foo A
    pattern Bad  :: Foo; pattern Bad  = Foo B

Later still:
    pattern Ugly :: Foo; pattern Ugly = Foo C

All fine, if there was no expectation that "Good, Bad" is a COMPLETE
set.  Such completeness is a matter of interface contract (design
intent), and cannot be derived.

-- 
    Viktor.


More information about the Haskell-Cafe mailing list