[Haskell-cafe] is closing a class this easy?

Edward Kmett ekmett at gmail.com
Fri Jul 17 20:40:28 EDT 2009


I've used a similar approach for a while, for instance in
http://comonad.com/haskell/type-int/src/Data/Type/Boolean.hs

<http://comonad.com/haskell/type-int/src/Data/Type/Boolean.hs>
But I think your approach is cleaner than mine, because it doesn't need my
seemingly superfluous closure term or fundep.

-Edward Kmett

On Fri, Jul 17, 2009 at 11:38 AM, Conor McBride
<conor at strictlypositive.org>wrote:

> Friends
>
> Is closing a class this easy?
>
> --------------------------------------
>
> module Moo
>  (  Public(..)
>  )  where
>
> class Private x => Public x where
>  blah :: ...
>
> class Private x where
>
> instance Private A where
> instance Public A where
>  blah = ...
>
> instance Private B where
> instance Public B where
>  blah = ...
>
> --------------------------------------
>
> Modules importing Moo get Public and its instances,
> but cannot add new ones: any such instances must be
> accompanied by Private instances, and Private is
> out of scope.
>
> Does this work? If not, why not? If so, is this well
> known?
>
> It seems to be just what I need for a job I have in
> mind. I want a class with nothing but hypothetical
> instances. It seems like I could write
>
> --------------------------------------
>
> module Noo
>  (  Public(..)
>  ,  public
>  )  where
>
> class Private x => Public x where
>  blah :: ...
>  blah = ...
>
> class Private x where
>
> public :: (forall x. Public x => x -> y) -> y
> public f = f Pike
>
> data Pike = Pike
> instance Private Pike
> instance Public Pike
>
> --------------------------------------
>
> But if I don't tell 'em Pike, I've ensured that
> blah can only be used in the argument to public.
>
> Or is there a hole?
>
> Cures youriously
>
> Conor
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090717/0f220e96/attachment.html


More information about the Haskell-Cafe mailing list