[Haskell-cafe] Partial Evaluation

Bryan O'Sullivan bos at serpentine.com
Wed Mar 21 15:08:39 EDT 2007


jim burton wrote:
> I am reading Hudak's paper Modular Domain Specific Languages and Tools 
> [1] and am confused by his use of the term `Partial Evaluation'. I 
> understand it to mean supplying some but not all arguments to a 
> function, e.g. (+3) but it seems to mean something else too.

That's partial application you're thinking of.  In the context of inline 
operators, this is referred to as a section.

Partial evaluation actually executes some of a partially applied 
function, generating a new function that is specialised to the given 
arguments.

Here's a silly, contrived example to illustrate the difference. 
Consider this function:

sumPlus :: Num a => [a] -> a -> a
sumPlus xs y = sum xs + y

Here's a partially applied version of the function:

sumPlus ([3,2] :: [Int])

Its type is

Int -> Int

If you partially evaluate this function, you're evaluating as much of 
the function as possible at "compile time" (usually in a separate 
partial evaluation tool that generates a whole new source file for the 
real compiler), and getting a new specialised function:

sumPlus32 :: Int -> Int
sumPlus32 y = 5 + y

You could expect a decent compiler to apply this kind of transformation 
under limited circumstances, but partial evaluation is much more 
ambitious.  The canonical example is partially evaluating a language 
interpreter by giving it a chunk of source as the input to specialise 
on.  This produces a new interpreter that is specialised to interpret 
exactly that source (aka the first Futamura projection), and which you 
might hope would do so more efficiently than the fully general interpreter.

	<b


More information about the Haskell-Cafe mailing list