Repeated variables in type family instances

Richard Eisenberg eir at cis.upenn.edu
Thu Jun 27 00:00:16 CEST 2013


Sure. Say you want a default type at any given kind. You could write something like this:

> type family Default (a :: k) :: k
> type instance Default (a :: *) = ()
> type instance Default (a :: * -> *) = []
> type instance Default (a :: * -> * -> *) = (,)
> type instance Default (a :: * -> * -> * -> *) = (,,)

This isn't perhaps the most useful example, but it works. 

Richard

On Jun 26, 2013, at 8:33 AM, Dominique Devriese wrote:

> Richard,
> 
> Thanks for your answers.
> 
> 2013/6/24 Richard Eisenberg <eir at cis.upenn.edu>:
>> 
>> The nub of the difference is that type families can pattern-match on kinds,
>> whereas term-level functions cannot pattern-match on types. So, while the @a
>> is repeated in the pattern as written above, GHC does not, when matching a
>> pattern, check that these are the same. In fact, they have to be the same if
>> the function argument is well-typed. On the other hand, type family
>> equations *can* branch based solely on kind information, making the repeated
>> variable semantically important.
> 
> Interesting,  I wasn't aware this was possible.  I agree that if it's
> possible to branch solely on kind info, then they should be taken into
> account for the linearity check. Do you perhaps have an example of how
> to do this sort of branching?
> 
> Thanks,
> Dominique




More information about the Glasgow-haskell-users mailing list