[Haskell-cafe] Probably type checker error.

David Menendez dave at zednenem.com
Mon Jun 20 18:08:23 CEST 2011


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 <sergueyz at gmail.com> 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 <miguelimo38 at 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 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
>



-- 
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>



More information about the Haskell-Cafe mailing list