Modularity lets components be understood and reused independently, while the whole program derives its meaning from component meanings and explicit composition rules. Pure functions support this by separating computation from input acquisition and result handling. section 1.3 section 1.0
Separating computation from effects
A coffee-purchasing function that charges a card internally couples calculation with payment. Returning the coffee and charge information instead separates the computation from what happens to the result, making the logic easier to test and reuse in operations such as buying multiple coffees or combining charges. section 1.3
Referential transparency enables local reasoning: replace a function call with its result without tracking surrounding state changes. This substitution-based reasoning reduces mental simulation and makes independently composed parts easier to understand. section 1.3
Composing parallel computations
An operation such as val outputList = parMap(inputList)(f) describes applying a function across a collection without exposing execution details. Separating the description of a computation from its execution supports a composable, high-level interface. section 7.0









