Skip to content
  • Simon Peyton Jones's avatar
    [project @ 2001-03-05 15:37:25 by simonpj] · c8276ef7
    Simon Peyton Jones authored
    Exploit the 1-shot lambda HACK in etaExpandArity
    
    We often find code like
    
    	f :: Int -> IO ()
    	f = \ x -> case ... of
    			p1 -> \s -> ...rhs1...
    			p2 -> \s -> ...rhs2...
    
    where the \s is a state transformer lambda.  Almost invariably
    these \s things are one-shot; that is, we virtually never say
    
    	let
    	   h = f 3
    	in
    	h >> h >> h
    
    In this case we'd be much better off eta-expanding f, to
    
    	f :: Int -> IO ()
    	f = \ x \ s -> case ... of
    			   p1 -> ...rhs1...
    			   p2 -> ...rhs2...
    
    GHC already has a MAJOR HACK in
    
    	Id.isOneShotLambda
    
    which declares that any \s::State# T is a one-shot lambda.  It's
    almost always true, and it makes a big difference.
    
    
    This commit simply makes use of isOneShotLambda to improve the
    results of CoreUtils.etaExpandArity.  Which has the desired effect.
    
    There isn't a flag to control the MAJOR HACK yet.  Maybe there should be.
    
    Anyway, some of Manuel's array code should improve a lot.
    c8276ef7