[Haskell-beginners] incoherent instance question

Graham Gill math.simplex at gmail.com
Sat Jun 9 01:24:57 UTC 2018


Thanks for the explanation David. The problem is clear from your
description, and when you *really* do want to do it anyway I guess that's
what the INCOHERENT and OVERLAPS/OVERLAPPING pragmas are for, to help you
control the types.

Just remember that they are "typeclasses", not "classclasses".


Actually I wasn't thinking in terms of "classclasses", instead, of
mathematical equivalences. A set of reals is bounded iff it is both upper
and lower bounded. I wanted to try to express that in types, and wondered
if I could do it without resorting to asymmetrical syntax (the newtype
suggestion).

Regards,
Graham


On Mon, Jun 4, 2018 at 8:54 AM David McBride <toad3k at gmail.com> wrote:

> This is a common thing that people try to do.  I want class A to apply to
> any type in which class B already applies.  It seems to mimic what would
> work in object oriented programming and it is hard to see at first why it
> doesn't work in haskell.
>
> Just remember that they are "typeclasses", not "classclasses".  When you
> write
>
> class Foo a where foo :: ...
> instance Show a => Foo a where foo = something
>
> Everything seems fine, but then you could write additional classes like
> this
>
> instance Read a => Foo a where foo = something_else
>
> And what if you had a type that is both a Read and Show, like Int?  Now
> there are two different things it could do -- something and
> something_else.  How to decide?  Based on order?  But then the behavior of
> the program could dramatically change based on the import order.
>
> I would advise you to treat Bounded, UpperBounded, and LowerBounded to be
> separate properties and define them on all types explicitly rather than
> trying to obtain instances for free.
>
> On Sun, Jun 3, 2018 at 11:42 PM, Graham Gill <math.simplex at gmail.com>
> wrote:
>
>> Please see the paste: https://pastebin.com/zBim7Zkx
>>
>> I'm experimenting with defining UpperBounded and LowerBounded
>> typeclasses. An example type belonging to the latter that is not also
>> Bounded would be type Natural from Numeric.Natural.
>>
>> I want to say that if a type is Bounded, then it is also UpperBounded and
>> LowerBounded. If a type is both UpperBounded and LowerBounded, then it is
>> also Bounded.
>>
>> To express the constraints, I need FlexibleInstances and
>> UndecidableInstances extensions. These allow the module to load into ghci
>> (8.4.2) with only a warning, but, without the INCOHERENT pragmas, I get an
>> overlapping instance error if I try to evaluate minBound, maxBound,
>> upperBound or lowerBound instantiated to either of the types Foo or Bar.
>>
>> A solution is to apply the INCOHERENT pragma to the instances at lines
>> 11, 14 and 17. Reading over section 10.8.3.6. Overlapping instances in the
>> GHC User Guide, I believe I understand. (Is there a better solution?)
>>
>> In the paste, I have INCOHERENT pragmas only at lines 11 and 17. This
>> gives me the following behaviour in ghci:
>>
>>    1. minBound, maxBound, upperBound and lowerBound instantiated to type
>>    Foo all function as expected, evaluating to the appropriate lower or upper
>>    bound.
>>    2. upperBound and maxBound instantiated at Bar give overlapping
>>    instance errors for UpperBounded, as expected.
>>    3. lowerBound :: Bar evaluates to C, as expected.
>>    4. minBound :: Bar gives an overlapping instance error for
>>    UpperBounded:
>>
>> *UpperLowerBounded> minBound :: Bar
>>
>> <interactive>:141:1: error:
>>    • Overlapping instances for UpperBounded Bar
>>        arising from a use of ‘minBound’
>>      Matching instances:
>>        instance [safe] Bounded a => UpperBounded a
>>          -- Defined at UpperLowerBounded.hs:14:10
>>        instance [safe] UpperBounded Bar -- Defined at
>> UpperLowerBounded.hs:31:10
>>    • In the expression: minBound :: Bar
>>      In an equation for ‘it’: it = minBound :: Bar
>>
>>
>> It's #4 that I don't understand. An explanation would be very much
>> appreciated. (Also, what's a [safe] instance?)
>>
>> Regards,
>> Graham
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20180608/823b81b7/attachment-0001.html>


More information about the Beginners mailing list