We have developed a method for short-cut fusion using |foldr|/|build|. By introducing the definition:
\begin{code}
build :: ((a -> [a] -> [a]) -> [b] -> c) -> c
build g = g (:) []
\end{code}
The standard definition of |map| is:
\begin{code}
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
\end{code}
But we redefine it as:
\begin{code}
map :: (a -> b) -> [a] -> [b]
map f = foldr ((:) . f) []
\end{code}
Which now allows us to have the property:
\begin{code}
propEq g k z = foldr k z (build g) == g k z
\end{code}