| So the 'where' binding in the following does not get generalized
| because it could not have been written at the top level, correct?
The other way round. 'where' bindings that could have been written at top level *are* generalised; ones that could not are *not* generalised. See "Which bindings are affected?" in http://hackage.haskell.org/trac/ghc/blog/LetGeneralisationInGhc7, which tries to be precise. If it's hard to understand can I make it easier?
Simon
|| >>>>>
| 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