Fair enough.

So if I understand you correctly, () is becoming more overloaded as to its 
kind? 

Right now it seems it is either * or Constraint depending on context. 

As I understand you, fixing this seems to indicate that () could have any 'a -> 
Constraint' kind as well.

This raises similar questions about (,) and how to build 'a -> Constraint' 
products nicely.

Sent from my iPad

On Dec 23, 2011, at 4:42 AM, Simon Peyton-Jones <simo...@microsoft.com> wrote:

> it’s a bug.  I’m fixing it.
> 
> Simon
>  
> From: glasgow-haskell-users-boun...@haskell.org 
> [mailto:glasgow-haskell-users-boun...@haskell.org] On Behalf Of Edward Kmett
> Sent: 22 December 2011 17:03
> To: Bas van Dijk
> Cc: glasgow-haskell-users@haskell.org
> Subject: Re: ConstraintKinds and default associated empty constraints
>  
> On Wed, Dec 21, 2011 at 6:45 PM, Bas van Dijk <v.dijk....@gmail.com> wrote:
> I'm playing a bit with the new ConstraintKinds feature in GHC
> 7.4.1-rc1. I'm trying to give the Functor class an associated
> constraint so that we can make Set an instance of Functor. The
> following code works but I wonder if the trick with: class Empty a;
> instance Empty a, is the recommended way to do this:
> 
> {-# LANGUAGE ConstraintKinds, TypeFamilies, FlexibleInstances #-}
> 
> import GHC.Prim (Constraint)
> 
> import Prelude hiding (Functor, fmap)
> 
> import           Data.Set (Set)
> import qualified Data.Set as S (map, fromList)
> 
> class Functor f where
>     type C f :: * -> Constraint
>     type C f = Empty
> 
>     fmap :: (C f a, C f b) => (a -> b) -> f a -> f b
> 
> class Empty a; instance Empty a
> 
> instance Functor Set where
>     type C Set = Ord
>     fmap = S.map
> 
> instance Functor [] where
>     fmap = map
> 
> testList = fmap (+1) [1,2,3]
> testSet  = fmap (+1) (S.fromList [1,2,3])
> 
> Cheers and thanks for a great new feature!
> 
> Bas
> 
>  
> This is the same solution I wound up with in
>  
> https://github.com/ekmett/constraints 
>  
> Adding an argument to the family would work but is somewhat unsatisfying as 
> it mucks with polymorphic recursive use of the dictionary, and with placing 
> constraints on constraints, so I prefer to keep as few arguments as possible.
>  
> You can go farther with Functor by using polymorphic kinds and indexing the 
> source and destination Category as well as the class of objects in the 
> category.
>  
> I should probably write up what I've done with this, but doing so lets you 
> have real product and coproduct Category instances, which were previously not 
> possible (a fact which in part drove me to write all the semigroupoid code i 
> have on hackage.
>  
> -Edward
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to