Strictness confusion

Ian Lynagh igloo at earth.li
Thu Jun 24 21:39:10 EDT 2004


Hi all,

If I have the following module:

----------8<--------------------8<----------
module Q (foo) where

foo :: String -> [String] -> Bool
#ifdef FIRST
foo x _ | x `seq` x == "." = True
#else
foo x _ |         x == "." = True
#endif
foo x xs = x `seq` any (x ==) xs
----------8<--------------------8<----------

then I would expect the code to be identical regardless of whether FIRST
is defined or not. However, the following shows that (without the first
seq) GHC forces the evaluation of x due to the seq in the last line.
But, as I understand it, it should know that x has already been
evaluated (to WHNF). This also seems to affect what gets inlined in
larger examples.

Am I confused?

$ rm -f *.o
$ /usr/bin/ghc -ddump-simpl -cpp -O -c Q.hs -DFIRST > 1
$ rm -f *.o
$ /usr/bin/ghc -ddump-simpl -cpp -O -c Q.hs > 2
$ diff -u1000 1 2
--- 1   Fri Jun 25 02:11:46 2004
+++ 2   Fri Jun 25 02:12:02 2004
@@ -1,32 +1,34 @@
 
 ==================== Tidy Core ====================
 Q.a :: GHC.Base.Char
 [GlobalId]
 NoCafRefs Str: DmdType m
 Q.a = GHC.Base.C# '.'
 
 Q.lvl :: [GHC.Base.Char]
 [GlobalId]
 NoCafRefs Str: DmdType
 Q.lvl = GHC.Base.:
          @ GHC.Base.Char Q.a (GHC.Base.[] @ GHC.Base.Char)
 
 Q.foo :: GHC.Base.String -> [GHC.Base.String] -> GHC.Base.Bool
 [GlobalId]
 Arity 2 NoCafRefs Str: DmdType SL
 Q.foo = \ x :: GHC.Base.String ds :: [GHC.Base.String] ->
          case GHC.Base.eqString x Q.lvl of wild {
            GHC.Base.True -> GHC.Base.True;
            GHC.Base.False ->
+             case x of tpl { __DEFAULT ->
              GHC.List.any
                @ GHC.Base.String
-               (\ ds1 :: GHC.Base.String -> GHC.Base.eqString x ds1)
+               (\ ds1 :: GHC.Base.String -> GHC.Base.eqString tpl ds1)
                ds
+             }
          }
 
 
 
 
 ==================== Tidy Core Rules ====================
 
 
$ 


Thanks
Ian



More information about the Glasgow-haskell-users mailing list