[Haskell-cafe] Probably type checker error.

Serguey Zefirov sergueyz at gmail.com
Sun Jun 19 16:26:30 CEST 2011


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?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: a.hs
Type: application/octet-stream
Size: 2024 bytes
Desc: not available
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110619/743e1644/attachment.obj>


More information about the Haskell-Cafe mailing list