problem generating Core with no-implicit-prelude

Hal Daume III hdaume@ISI.EDU
Tue, 29 Oct 2002 09:57:12 -0800 (PST)


Hi all,

I think there's a problem with the external core generation.  Suppose we
have the following module:

-----
module Test where

data Bool = True | False
data Maybe a = Just a | Nothing

class Eq a where
    (==) :: a -> a -> Bool

instance Eq Bool where
    (==) True  True  = True
    (==) False False = True
    (==) _     _     = False

instance Eq a => Eq (Maybe a) where
    (==) Nothing  Nothing  = True
    (==) (Just a) (Just b) = (==) a b
    (==) _        _        = False
-----

We compile this using:
  ghc -fext-core -fno-code test.hs -fno-implicit-prelude

Now, if we look at the core, inside the definition of Test.zdfEqMaybe (the
eq function for Maybe a), it essentially looks like (glossing over some of
the extraneous stuff):

  Test.zdfEqMaybe = \ zddEq -> Test.ZCDEq
                    \ ds ds1 ->
         case ds of
           Nothing -> case ds1 of
                        Test.Just a1 -> Test.zdwFalse
                        Test.Nothing -> Test.zdwTrue
           Just a1 -> case ds1 of
                        Test.Nothing -> Test.zdwFalse
                        Test.Just b  -> Test.zeze zddEq a1 b

Now, the problem is that "Test.ZCDEq" isn't defined anywhere in the core
file produced and neither is Test.zeze.

If this is indeed a bug, could someone fix it?  If not, could someone tell
me what I'm doing wrong (I could be misreading the Core, but I don't think
so).

 - Hal

p.s., the full core output reads:

%module Test
  %data Test.Bool =
    {Test.True;
     Test.False};
  %data Test.Maybe a =
    {Test.Just a;
     Test.Nothing};
  %newtype Test.ZCTEq a = GHCziPrim.ZLzmzgZR
			  a
			  (GHCziPrim.ZLzmzgZR a Test.Bool);
  Test.zdfEqBool :: GHCziPrim.ZLzmzgZR
		    Test.Bool
		    (GHCziPrim.ZLzmzgZR Test.Bool Test.Bool) =
    \ (ds::Test.Bool) (ds1::Test.Bool) ->
	%case ds %of (wild::Test.Bool)
	  {Test.False ->
	     %case ds1 %of (wild1::Test.Bool)
	       {Test.True ->
		  Test.zdwFalse;
		Test.False ->
		  Test.zdwTrue};
	   Test.True ->
	     ds1};
  Test.zdfEqMaybe :: %forall a . GHCziPrim.ZLzmzgZR
				 (GHCziPrim.ZLzmzgZR a (GHCziPrim.ZLzmzgZR
a Test.Bool))
				 (GHCziPrim.ZLzmzgZR
				  (Test.Maybe a)
				  (GHCziPrim.ZLzmzgZR (Test.Maybe
a) Test.Bool)) =
    %note "InlineMe"
    \ @ a
      (zddEq::GHCziPrim.ZLzmzgZR a (GHCziPrim.ZLzmzgZR a Test.Bool)) ->
	Test.ZCDEq @ (Test.Maybe a)
	(\ (ds::Test.Maybe a) (ds1::Test.Maybe a) ->
	     %case ds %of (wild::Test.Maybe a)
	       {Test.Nothing ->
		  %case ds1 %of (wild1::Test.Maybe a)
		    {Test.Just (a1::a) ->
		       Test.zdwFalse;
		     Test.Nothing ->
		       Test.zdwTrue};
		Test.Just (a1::a) ->
		  %case ds1 %of (wild1::Test.Maybe a)
		    {Test.Nothing ->
		       Test.zdwFalse;
		     Test.Just (b::a) ->
		       Test.zeze @ a zddEq a1 b}});

--
Hal Daume III

 "Computer science is no more about computers    | hdaume@isi.edu
  than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume