[Haskell-cafe] Probably type checker error.
Serguey Zefirov
sergueyz at gmail.com
Mon Jun 20 21:14:16 CEST 2011
Thank you very much. I'll try that too.
2011/6/20 David Menendez <dave at zednenem.com>:
> 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