[Haskell-cafe] Problem with haskell types

roconnor at theorem.ca roconnor at theorem.ca
Fri Jul 30 17:34:45 EDT 2010

I was one of the people on #haskell discussing this with Anupam.

Note that that when you remove the signature of d, the result complies and 
ghci will state the inferred type of d is exactly the signature that you 
are not allowed to write.

In my opinion, this is a bug in the Haskell 98 report where it says

``If the programmer supplies explicit type signatures for more than one 
variable in a declaration group, the contexts of these signatures must be 
identical up to renaming of the type variables.

The problem is that we cannot give a type signature to d with exactly the 
constraints of d_test because d doesn't have any type variable in its type 

At the very least the Haskell report should allow type checking to proceed 
if everything in a declaration group has a signature even if the 
signatures don't have identical constraints.

A trac ticket is needed for Haskell 2011, if one doesn't already exist.

On Sat, 31 Jul 2010, Anupam Jain wrote:

> Hi,
> I am having trouble getting a small program to compile. The helpful folks at #haskell created a version of the
> program that does compile - http://hpaste.org/fastcgi/hpaste.fcgi/view?id=28406#a28408 but it is not very clear
> to them (and to me) why the original program wouldn't type compile in the first place.
> Here's the program that refuses to compile -
> module Delme () where
> data DecisionState = A | B | C | D
> d_test :: Eq b => b -> b -> DecisionState -> DecisionState -> ()
> d_test test testVal trueState falseState =
>     if (test == testVal)
>      then d trueState
>      else d falseState
> d :: DecisionState -> ()
> d A = d_test True True B C
> d B = d_test 1 2 C D
> d C = d_test True False A B
> d D = ()
> I get an error like -
> Delme.hs:13:0:
>     Contexts differ in length
>       (Use -XRelaxedPolyRec to allow this)
>     When matching the contexts of the signatures for
>       d_test :: forall b.
>                 (Eq b) =>
>                 b -> b -> DecisionState -> DecisionState -> ()
>       d :: DecisionState -> ()
>     The signature contexts in a mutually recursive group should all be identical
>     When generalising the type(s) for d_test, d
> Putting in the extension does get the program to type check but the original program should have type compiled
> in the first place.
> The ironic thing we discovered is that if we remove the type declaration for 'd', the program type checks, and
> GHC then derives the exact same type which we removed!
> Can some of the smarter people in the room please shed more light on this?
> -- Anupam

Russell O'Connor                                      <http://r6.ca/>
``All talk about `theft,''' the general counsel of the American Graphophone
Company wrote, ``is the merest claptrap, for there exists no property in
ideas musical, literary or artistic, except as defined by statute.''

More information about the Haskell-Cafe mailing list