Yeah, seems to work too. Отправлено с iPhone
Jun 20, 2011, в 10:55, "Corey O'Connor" <coreyocon...@gmail.com> написал(а): > 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 >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe