[Haskell-cafe] Kind-agnostic type classes
David Menendez
dave at zednenem.com
Fri Oct 3 13:36:45 EDT 2008
On Fri, Oct 3, 2008 at 9:49 AM, Luke Palmer <lrpalmer at gmail.com> wrote:
> On Fri, Oct 3, 2008 at 4:22 AM, Florian Weimer <fw at deneb.enyo.de> wrote:
>> I'm trying to encode a well-known, informally-specified type system in
>> Haskell. What causes problems for me is that type classes force types
>> to be of a specific kind. The system I'm targeting however assumes that
>> its equivalent of type classes are kind-agnositic.
>
> There is no choice of kinds, they are forced by the methods (since the
> kind of an actual argument is * by definition). But see below.
>
>> For instance, I've got
>>
>> class Assignable a where
>> assign :: a -> a -> IO ()
>>
>> class Swappable a where
>> swap :: a -> a -> IO ()
>>
>> class CopyConstructible a where
>> copy :: a -> IO a
>>
>> class (Assignable a, CopyConstructible a) => ContainerType a
>>
>> class (Swappable c, Assignable c, CopyConstructible c) => Container c where
>> size :: (Num i, ContainerType t) => c t -> IO i
>
> Which is illegal because the three above classes force c to be kind *,
> but you're using it here as kind * -> *.
>
> What you want is not this informal "kind-agnostic" classes so much as
> quantification in constraints, I presume. This, if it were supported,
> would solve your problem.
>
> class (forall t. Swappable (c t), forall t. Assignable (c t), forall
> t. CopyConstructible (c t)) => Contanter c where ...
>
> Incidentally, you *can* do this if you go to a dictionary passing
> style (because then you are providing the proofs, rather than asking
> the compiler to infer them, which is probably undecidable (what isn't
> ;-)).
You don't necessarily need explicit dictionaries.
For example, I've occasionally wanted to have a constraint (forall a.
Show a => Show (f a)). One fairly simple way to do this to declare a
new class.
class Show1 f where
showsPrec1 :: (Show a) => Int -> f a -> ShowS
instance Show1 [] where
showsPrec1 = showsPrec
The same technique is used in Data.Typeable.
--
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>
More information about the Haskell-Cafe
mailing list