 "xx")"y" and then to the normal order "yy", taking two steps instead of three.Most "purely" functional programming languages (notably Miranda and its descendants, including Haskell), and the proof languages of theorem provers, use "lazy evaluation", which is essentially the same as call by need.This is like normal order reduction, but call by need manages to avoid the duplication of work inherent in normal order reduction using "sharing".