On Sat, Apr 25, 2009 at 07:20:20PM +1000, Roman Leshchinskiy wrote: > On 25/04/2009, at 17:32, Max Bolingbroke wrote: > > >2009/4/25 Roman Leshchinskiy <r...@cse.unsw.edu.au>: > >>On 25/04/2009, at 04:20, Ian Lynagh wrote: > >> > >>>Fri Apr 24 05:47:54 PDT 2009 Ian Lynagh <ig...@earth.li> > >>> * Require a bang pattern when unlifted types are where/let bound; > >>>#3182 > > > >Yeah, I'm also not convinced about this change. The real ticket is > >#2806. http://hackage.haskell.org/trac/ghc/ticket/2806
Ooops, sorrry about that. > Thanks Max, I now understand the reasoning behind this change a bit > better. However, I'm still not convinced that it is a good idea, All in my opinion: * The fact that you are even allowed to let/where-bind values with unlifted type is surprising. Making it clearer that something odd is going on is a good thing. If it were up to me I think I would disallow them completely. * It would make sense to go even further. You should not be able to say (g (f x)) where f returns an unlifted type, but would instead have to say (case f x of !y -> g y). * Making it less convenient to use unboxed values directly is not necessarily a bad thing. I have the impression that people resort to using them too readily. (I imagine that you're using them in dph code, and that this point doesn't apply to that). > As to uniformity and forgetting about patterns for the moment, this > change breaks the following equality: > > let v = e1 in e2 = (\v -> e1) e2 > > This is quite unfortunate, IMO. Unlifted types break lots of things, e.g. beta reduction: (\_ -> ()) (case 1 `div` 0 of GHC.Base.I# i -> i) = _|_ At least if you try to rewrite according to your above equation you will get a compilation failure, rather than a change in semantics. Thanks Ian _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc