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 <miguelim...@yandex.ru>: > 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 >> 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