GHC 6.12 introduces MonoLocalBinds, which disables polymorphic values in let statements.
Your original code works for me if I use -XNoMonoLocalBinds -XNoMonomorphismRestriction. On Mon, Jun 20, 2011 at 9:02 AM, Serguey Zefirov <[email protected]> wrote: > The fact is that (Num a) context works and (ToWires a, Num a) context > doesn't. At least in 6.12.1. > > This still looks to me like a bug. > > 2011/6/19 Miguel Mitrofanov <[email protected]>: >> Seems like let-generalization is at work here. >> >> Types of all values in the "where" section are inferred basically as if they >> are declared at the top level. Therefore, inheritance fails without >> NoMonomorphismRestriction. >> >> 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 >>> [email protected] >>> http://www.haskell.org/mailman/listinfo/haskell-cafe >> >> > > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe > -- Dave Menendez <[email protected]> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
