unfold/fold

A program transformation where a recursive call to a function is unfolded to an instance of the function's body and then later an instance of the function's body is replaced by a call. E.g.

	sumdouble l = sum (double l)

	double l = case l of
	           []   -> []
		   x:xs -> 2*x + double xs

	==> (unfold double)

	sumdouble l = sum (case l of
		           []   -> []
			   x:xs -> 2*x : double xs)

	==> (distribute over case)

	sumdouble l = case l of
		      []   -> sum []
		      x:xs -> sum (2*x : double xs)

 	==> (unfold sum)

	sumdouble l = case l of
		      []   -> 0
		      x:xs -> 2*x + sum (double xs)

 	==> (fold sumdouble)

	sumdouble l = case l of
		      []   -> 0
		      x:xs -> 2*x + sumdouble xs