[Haskell-cafe] Probably type checker error.

MigMit miguelimo38 at yandex.ru
Mon Jun 20 12:32:01 CEST 2011


Yeah, seems to work too.

Отправлено с iPhone

Jun 20, 2011, в 10:55, "Corey O'Connor" <coreyoconnor at 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 at haskell.org
> > http://www.haskell.org/mailman/listinfo/haskell-cafe
> 
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110620/993a6779/attachment.htm>


More information about the Haskell-Cafe mailing list