[clean-list] where are function type restrictions discussed?

Thomas van Noort thomas at cs.ru.nl
Tue Aug 26 17:23:13 MEST 2008


Hi,

You are right, the constraints in:

sumlength :: [t] t t -> (t,t) | +, one t

state that there must be an instance available for the type t of the 
type class + and one. I think you are a bit confused by the fact that 
type classes not necessarily need to start with an uppercase letter 
(like one), or even a letter at all (like +). Identifiers after the | 
symbol always refer to a type class, never to a function. However, a 
type class can define a function with the same identifier as the type 
class itself.

For example,

class foo where
   foo :: a -> a

and

class Bar where
   Bar :: a -> a

are valid type class definitions and can be used as constraints in the 
type of a function

f :: a a -> a | foo, Bar a

It seems like the constraints refer to functions, but actually refer to 
type classes.

Regards,
Thomas

Note: Functions can appear in the constraints of a function. However, 
these are *generic* functions, which happen to be implemented in Clean 
using overloading.

terrence.brannon wrote:
> 
> 
> terrence.brannon wrote:
>>
>>
>> I am confused by the pipe syntax. Where is it fully discussed with
>> examples?
>>
>>
> 
> Here's another example:
> 
>     sumlength :: [t] t t -> (t,t) | +, one t
> 
> I'm guessing this is saying that both + and one must be applicable to the
> argument of type t
> 
> So in some cases it seems to be saying that a certain function must be
> applicable and in other cases it is saying that the datum has to be of a
> certain type.
> 
> But I dont know where to find this fully described with examples, so I'm
> sort of hitting in the dark :)
> 
> 
> 



More information about the clean-list mailing list