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