[Haskell-cafe] ANN: exists-0.1

Mikhail Vorozhtsov mikhail.vorozhtsov at gmail.com
Tue Feb 7 07:23:50 CET 2012


On 02/06/2012 03:32 AM, Gábor Lehel wrote:
> There's a common pattern in Haskell of writing:
>
> data E where E :: C a =>  a ->  E
> also written
> data E = forall a. C a =>  E a
>
> I recently uploaded a package to Hackage which uses the new
> ConstraintKinds extension to factor this pattern out into an Exists
> type parameterized on the constraint, and also for an Existential type
> class which can encompass these kind of types:
>
> http://hackage.haskell.org/package/exists
>
> My motivation was mostly to play with my new toys, if it turns out to
> be useful for anything that's a happy and unexpected bonus.
>
> Some interesting things I stumbled upon while writing it:
>
[snip]
> - One of the advantages FunctionalDependencies has over TypeFamilies
> is that type signatures using them tend to be more readable and
> concise than ones which have to write out explicit equality
> constraints. For example, foo :: MonadState s m =>  s ->  m () is nicer
> than foo :: (MonadState m, State m ~ s) =>  s ->  m (). But with
> equality superclass constraints (as of GHC 7.2), it's possible to
> translate from TF-form to FD-form (but not the reverse, as far as I
> know): class (MonadStateTF m, s ~ State m) =>  MonadStateFDish s m;
> instance (MonadStateTF m, s ~ State m) =>  MonadStateFDish s m.
Even better, you can write

type ExistentialWith c e = (Existential e, c ~ ConstraintOf e)

instead of

class    (Existential e, c ~ ConstraintOf e) => ExistentialWith c e
instance (Existential e, c ~ ConstraintOf e) => ExistentialWith c e

and drop UndecidableInstances.




More information about the Haskell-Cafe mailing list