ANNOUNCE: GHC 7.4.1 Release Candidate 1
Antoine Latter
aslatter at gmail.com
Fri Dec 23 15:18:46 CET 2011
On Fri, Dec 23, 2011 at 3:04 AM, Simon Peyton-Jones
<simonpj at 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
More information about the Glasgow-haskell-users
mailing list