Pure functions are easy to recompose since there's no side effects.
You can delay execution, or cache execution, and it's all mostly the same.
This allows lots of interesting architectures to be viable; you can slice sub-trees at arbitrary levels and cache fluidly at different levels.