Thank you very much. I'll try that too. 2011/6/20 David Menendez <[email protected]>: > 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
