This book provides a practical approach to understanding implementations of non-strict functional languages using lazy graph reduction. It is intended to be a source of practical laboratory work material and to help students to develop, modify and experiment with their own implementations. The emphasis lies on the building of working prototypes of several functional language implementations and in each case the approach is to give a complete working prototype of a particular implementation, then lead the reader through a sequence of improvements to expand its scope. The prototypes are expressed in the functional language Miranda and software is available in machine-readable form.