
Yeah, seems to work too.
Отправлено с iPhone
Jun 20, 2011, в 10:55, "Corey O'Connor"
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...
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?
_______________________________________________ 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