It sounds like the following example may help:

> class A alpha where
>   a :: alpha -> Int
>
> class A beta => B beta where
>   b :: beta -> Int
>
> class C gamma where
>   c :: gamma -> Int
>
> foo :: B beta => beta -> Int
> foo x = a x + b x
> -- the (A beta) is implied by the superclass constraint)
>
> bar :: C gamma => gamma -> Int
> bar x = a x + c x
> -- ERROR: no instance of A gamma

The superclass constraint A beta => B beta means that anywhere a B beta 
constraint is written, the constraint A beta is inferred. For this all to work 
out, it also means that any instance of B must be coupled with an instance for 
A.

Does this help clarify?

Richard

On Jun 30, 2013, at 1:46 PM, Patrick Browne wrote:

> As you say if I omit references to superclass methods in the subclasses then 
> I get different compile time behaviour.
> But then the question is that if a putative subclass has no reference to 
> superclass methods should it be a subclass at all?
> I deliberately want to model the case where each subclass depends on the 
> superclass.
> Hence, I have arranged that each subclass method calls a superclass method. 
> If I remove the references to the superclass methods would that indicate that 
> I do not need the superclass?
> It seems that if a method is invoked in a class instance then there must 
> exist a definition of that method somewhere (not necessarily in the 
> class/instance hierarchy). 
> Where there exists a genuine sub/super relation, is there a case where the 
> compiler will not catch the implicit superclass (WithoutSubclass)  and *must* 
> have the explicit class hierarchy (WithoutSubclass).
> 
> The above represents my attempts to understand the semantics of Haskell 
> sub/super-classes. I may have missed something obvious.
> Thanks,
> Pat
> 
> On 29/06/13, Richard Eisenberg <e...@cis.upenn.edu> wrote:
>> 
>> Yes, the runtime behavior should be the same between those modules. But, the 
>> "compile-time behavior" is not. The superclass constraints  in your first 
>> version mean that every instance of, say, Building *must* be accompanied by 
>> an instance of "Shelter", regardless of the implementation of that instance. 
>> This would be easiest to see if your implementations did not call any 
>> functions, but just returned strings. With that change, in your second 
>> version, you could remove the instance for Shelter and everything would 
>> still compile. However, in the first, removing that instance would cause 
>> compile-time failures for the others, as the superclass constraint would not 
>> be satisfied.
>> 
>> I hope this helps!
>> Richard
>> 
>> On Jun 29, 2013, at 12:46 PM, Patrick Browne wrote:
>> 
>>> Hi,
>>> The runtime behaviour of the two modules below *seems* to be the same.
>>> Is this correct? 
>>> I am not trying to say "every building is a shelter", rather "anything that 
>>> is a building must provide sheltering services".
>>> I think that the use of sub-classes makes this explicit, but it *seems* 
>>> that one gets the same results without the subclass.
>>> Any clarification welcome.
>>> 
>>> Regards,
>>> Pat
>>> 
>>> -- ========================================
>>> module WithSubclass where
>>> data SomeWhereToShelter = SomeWhereToShelter 
>>> class Shelter shelter where
>>>  s :: shelter -> String
>>> class Shelter building => Building building where
>>>  b :: building -> String
>>> class Shelter house => House house where
>>>  h :: house -> String
>>> 
>>> instance Shelter SomeWhereToShelter where
>>>  s x = "Shelters afford basic sheltering"  
>>> instance Building SomeWhereToShelter where
>>>  b x =  (s x) ++ ", Buildings afford better sheltering"
>>> instance House SomeWhereToShelter where
>>>  h x = (s x) ++ (b x) ++  ", Houses afford even better sheltering"
>>> 
>>> 
>>> -- =======================================
>>> module WithoutSubclass where
>>> data SomeWhereToShelter = SomeWhereToShelter 
>>> 
>>> class Shelter shelter where
>>>  s :: shelter -> String
>>> class Building building where
>>>  b :: building -> String
>>> class House house where
>>>  h :: house -> String
>>> 
>>> instance Shelter SomeWhereToShelter where
>>>  s x = "Shelters afford basic sheltering"  
>>> instance Building SomeWhereToShelter where
>>>  b x =  (s x) ++ ", Buildings afford better sheltering"
>>> instance House SomeWhereToShelter where
>>>  h x = (s x) ++ (b x) ++  ", Houses afford even better sheltering"
>>> 
>>> Tá an teachtaireacht seo scanta ó thaobh ábhar agus víreas ag Seirbhís 
>>> Scanta Ríomhphost de chuid Seirbhísí Faisnéise, ITBÁC agus meastar í a 
>>> bheith slán. http://www.dit.ie
>>> This message has been scanned for content and viruses by the DIT 
>>> Information Services E-Mail Scanning Service, and is believed to be clean. 
>>> http://www.dit.ie _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe@haskell.org <Haskell-Cafe@haskell.org>
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>> 
> 
> Tá an teachtaireacht seo scanta ó thaobh ábhar agus víreas ag Seirbhís Scanta 
> Ríomhphost de chuid Seirbhísí Faisnéise, ITBÁC agus meastar í a bheith slán. 
> http://www.dit.ie
> This message has been scanned for content and viruses by the DIT Information 
> Services E-Mail Scanning Service, and is believed to be clean. 
> http://www.dit.ie

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to