An established problem in functional programming is the question of evaluation order (see Hudak, ยง2.2). Haskell offers seq; which allows the programmer to magically introduce dependencies in evaluation order and thence subvert lazy evaluation. Sometimes this is necessary; see the foldl foldl' example.

As I argued previously, C has converged to the something quite like functional programming: lexically scoped procedures take multiple arguments and return one value. This convergence vindicates both. But C is missing the entire lazy side of things! Seeing C's great efforts to permit this expression evaluation style (translating to a sequence of steps for CPUs), imperative programmers' lack of interest in evaluation order must be seen as a blind spot.


Girard's work on linear logic splits implication (lambda abstraction) into repetition and linear implication; \( A \rightarrow B := !A \multimap B \). Notably linear \( \beta \)-reduction obviates the need for sharing (as the argument is used exactly once) by pushing that question to the repetition part; it similarly makes strictness analysis trivial.

Thus there is still progress to be made with questions of evaluation. So far only Haskell has offered the glimpses of the future, with imperative programmers left behind.