On Fri, Dec 23, 2011 at 3:04 AM, Simon Peyton-Jones <simo...@microsoft.com> wrote: > Yes, it's expected; it's also the behaviour of GHC 6.12 etc. > > Here what is happening. You define > result = undefined > What type does it get? In 6.12, and 7.4, it gets type > result :: forall b. b > So the two uses of 'result' in the two branches of the case have no effect on > each other. > > But in 7.2 it was *not generalised*, so we got > result :: f2 a > And now the two uses *do* affect each other. > >
Thanks for the explanation. So the 'where' binding in the following does not get generalized because it could not have been written at the top level, correct? >>>>> cast :: (Typeable a, Typeable b) => a -> Maybe b cast x = r where r = if typeOf x == typeOf (fromJust r) then Just $ unsafeCoerce x else Nothing <<<<< > Why the change. You'll remember that over the last year GHC has changed not > to generalise local lets: > http://hackage.haskell.org/trac/ghc/blog/LetGeneralisationInGhc7 > > I relaxed the rule in 7.2, as discussed in "Which bindings are affected?" in > that post. For reasons I have not investigated, 7.2 *still* doesn't > generalise 'result'; but 7.4 correctly does. > > Simon _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users