Not just a proposal any more. :-) GHC 7.0 does not generalize local let bindings in some situations. See here for information: http://hackage.haskell.org/trac/ghc/blog/LetGeneralisationInGhc7
 
There is a proposal (from Big Simon) to remove let-generalization: http://research.microsoft.com/en-us/um/people/simonpj/papers/constraints/let-gen.pdf

On 19 Jun 2011, at 18:26, Serguey Zefirov wrote:

> Right now I write a quite heavy transformation of Haskell source code
> and found some strange behaviour of typechecker.
>
> Some prerequisites:
> -- dummy class. My own class is much bigger, but I
> -- could reproduce that behaviour with that class.
> class ToWires a
>
> -- a type with phantom type arguments.
> data E ins outs = E
>
> -- a function that relates E and its inputs.
> projectInsType :: E ins outs -> ins
> projectInsType = error "projectInsType gets evaluated."
>
> -- "register" function.
> register :: a -> a -> a
> register def a = def
>
> -- a simple addition.
> add2 :: (ToWires a, Num a) => (a,a) -> a
> add2 (a,b) = a+b
>
>
> First I have a function:
> func :: (ToWires a, Num a) => Maybe a -> a
> func mbA = currentSum
>       where
>               x = case mbA of
>                       Just a -> a
>                       Nothing -> 0
>               nextSum = add2 (x,currentSum)
>               currentSum = register 0 nextSum
>
> It typechecks and works just fine after some transformation.
>
> The transformation I work on transform code into something like that:
> func_E :: (ToWires a, Num a) => E (Maybe a) a
> func_E = r
>       where
>               r = E
>               -- here we relate mbA and r.
>               mbA = projectInsType r
>               x = case mbA of
>                       Just a -> a
>                       Nothing -> 0
>               nextSum = add2 (x,currentSum)
>               currentSum = register 0 nextSum
>
> Note the absence of input of func in transformed func_E. I relate mbA
> with it's proper type using binding "mbA = projectInsType r".
>
> Then suddently ghc loses all of the context associated with mbA. And
> find type error at the calling of add2.
>
> If I drop ToWires from contexts of func_E and add2 types, all works
> fine. If I change add2 to simple addition (x + currentSum), all works
> fine.
>
> Full source code is in attachment.
>
> I found it using ghc 6.12.1. I asked colleagues, they told me that the
> same error manifests itself in ghc 7.0.3.
>
> Should I fill a bug report or maybe I misunderstood something?
> <a.hs>_______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe