I'm sure I've used the feature that you're proposing to remove, but I'll adapt. 
To be clear, the change means no loss of expressiveness, just that I'll 
sometimes have to use a helper type family (closed or open), right?

If I'm right there, then no complaints from me.

Richard

On Jun 24, 2014, at 4:07 AM, Simon Peyton Jones <simo...@microsoft.com> wrote:

> I’m not sure when this ”feature” was added, but I’m pretty sure that my 
> original implementation of associated types was exactly what you describe in 
> the solution. Or did I miss anything?
>  
> I think you are right. I think I added the new stuff in a fit of enthusiasm 
> one day, a fit that I am now regretting!   But I’m just checking that no one 
> has meanwhile become addicted to it.
> 
> Simon
>  
> From: Manuel Chakravarty [mailto:mchakrava...@me.com] 
> Sent: 24 June 2014 08:54
> To: Simon Peyton Jones
> Cc: GHC List; ghc-d...@haskell.org
> Subject: Re: Associated type instances
>  
> Simon,
>  
> I’m not sure when this ”feature” was added, but I’m pretty sure that my 
> original implementation of associated types was exactly what you describe in 
> the solution. Or did I miss anything?
>  
> Manuel
>  
> Simon Peyton Jones <simo...@microsoft.com>:
> Friends
> 
> I want to make withdraw (or, rather, simplify) a little-known feature in GHC, 
> but before I do so I want to check that no one is going to have a heart 
> attack.
> 
> Relevant bits of the user manual: 
> http://www.haskell.org/ghc/docs/latest/html/users_guide/type-families.html#assoc-decl
> 
> All of this arose when thinking about fixing Trac #9063.
> 
> I believe that this change will affect essentially nobody, and I propose to 
> implement forthwith in HEAD (and hence 7.10). 
> 
> Does anyone object?
> 
> Thanks
> 
> Simon
> 
>  
> 
> The issue
> 
> Consider this:
> 
> class C a where
>    type T a b :: *
>  
> instance C [x] where
>    type T [x] b = x -> b
> That is just what you’d expect.  But currently this is allowed too:
> 
> instance C [x] where
>    type T [x] Int = x -> Int
>    type T [x] Bool = Bool -> x
> That is, GHC 7.8 allows many associated type instances, provided they don’t 
> overlap.  But, oddly you can’t further instantiate the instance pattern. This 
> would make just as much sense, but isn’t allowed:
> 
> instance C [x] where
>    type T [Int] b = b -> Int
>    type T [Bool] b = Bool -> b
> Moreover, as the user manual says, for an open kind like *, none of this 
> really makes sense. It really only makes sense for a closed kind. Something 
> like
> 
> class D a where
>    type S (b :: Bool) a :: *
> Now this would make some kind of sense:
> 
> instance D [x] where
>    type S True [x] = x -> x
>    type S False [x] = x
> But for closed kinds, you really want a closed type family.  So this would be 
> better:
> 
> instance D [x] where
>    type S b [x] = SHelp x b
>  
> type family SHelp x b where
>   SHelp x True = x -> x
>   SHelp x False = x
>  
> So yes, you do have to declare a named helper type, but you get something 
> much more perspicuous and explicit in exchange.
> 
> All of this also applies to the default declaration(s) which you can supply 
> for an associated type (see 7.7.3.2 in the link above), only it’s a bit more 
> complicated and indirect.
> 
> My solution
> 
> I propose to simplify substantially, as follows:
> 
> ·         The “shared arguments” of an associated type are the argument 
> positions that mention a type variable from the class header.  So in class C 
> above, the first argument position of T is “shared”; and in class D, the 
> second argument position of S is shared.
> 
> ·         A instance for an associated type (in a class instance declaration) 
> cf 7.7.3.1 must have
> 
> o   type variables in the non-shared argument positions, and
> 
> o   an exact copy of the corresponding instance header type in the shared 
> positions
> 
> ·         For each associated type you can have
> 
> o   at most one default declaration in the class declaration
> 
> o   at most one type instance declaration in the class instance declaration
> 
>  
> 
>  
> 
> _______________________________________________
> ghc-devs mailing list
> ghc-d...@haskell.org
> http://www.haskell.org/mailman/listinfo/ghc-devs
>  
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users@haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to