[Haskell-cafe] Probably type checker error.

Serguey Zefirov sergueyz at gmail.com
Mon Jun 20 15:02:22 CEST 2011


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
>
>



More information about the Haskell-Cafe mailing list