Let us consider the following simple code

> {-# OPTIONS -fglasgow-exts #-}
>
> module Foo where
>
> data Term a where
>    B    :: Bool -> Term Bool
>    C    :: Term Bool -> Term t -> Term t 
>    I    :: Int -> Term Int
>
> shw (I t) = ("I "++) . shows t
> shw (B t) = ("B "++) . shows t
> shw (C p q) = ("Cnd "++) . (shw p) . (shw q)

It loads in GHCi 6.4 and 6.4.1:

  Prelude> :l /tmp/g.hs
  Compiling Foo              ( /tmp/g.hs, interpreted )
  Ok, modules loaded: Foo.
  *Foo> :t I 1
  I 1 :: Term Int
  *Foo> :t B True
  B True :: Term Bool

However, when we do

  *Foo> :t shw
  shw :: Term Bool -> String -> [Char]

The inferred type of shw shows that it takes the values of 
Term *Bool*. And yet the very first clause of shw mentions (I t), which
GHCi correctly reports to be of the type Term Int...

It seems the last clause of shw confuses GHCi: if we remove it, the
inferred type of shw is "Term a -> String -> [Char]", as one would expect.

That is not a type expression printing problem: 

*Foo> shw (I 1)

<interactive>:1:5:
    Couldn't match `Bool' against `Int'
      Expected type: Term Bool
      Inferred type: Term Int
    In the application `I 1'

the first clause of shw notwithstanding...

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to