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

Miguel Mitrofanov miguelimo38 at yandex.ru
Sat Jul 18 02:51:26 EDT 2009


What is it for? Yes, you would know that only A and B are Public, but  
you have no way of telling that to the compiler.

I usually prefer something like that:

class Public x where
blah :: ...
isAB :: forall y. (A -> y) -> (B -> y) -> x -> y

Both solutions, however, allow the user to declare some new instances  
when GeneralizedNewtypeDeriving is enabled.

On 17 Jul 2009, at 19:38, Conor McBride 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



More information about the Haskell-Cafe mailing list