skip to main content
Skip header Section
An introduction to functional programmingJanuary 1988
Publisher:
  • Prentice Hall International (UK) Ltd.
  • Campus 400, Maylands Avenue Hemel Hempstead Hertfordshire, HP2 7EZ
  • United Kingdom
ISBN:978-0-13-484189-2
Published:01 January 1988
Pages:
300
Skip Bibliometrics Section
Bibliometrics
Abstract

No abstract available.

Cited By

  1. Reichl J, Hanenberg S and Gruhn V Does the Stream API Benefit from Special Debugging Facilities? A Controlled Experiment on Loops and Streams with Specific Debuggers Proceedings of the 45th International Conference on Software Engineering, (576-588)
  2. ACM
    Danvy O (2022). The Tortoise and the Hare Algorithm for Finite Lists, Compositionally, ACM Transactions on Programming Languages and Systems, 45:1, (1-35), Online publication date: 31-Mar-2023.
  3. ACM
    Mastorou L, Papaspyrou N and Vazou N Coinduction inductively: mechanizing coinductive proofs in Liquid Haskell Proceedings of the 15th ACM SIGPLAN International Haskell Symposium, (1-12)
  4. ACM
    Mehlhorn N and Hanenberg S Imperative versus declarative collection processing Proceedings of the 44th International Conference on Software Engineering, (1157-1168)
  5. Bribiesca E (2019). The spirals of the Slope Chain Code, Pattern Recognition, 95:C, (247-260), Online publication date: 1-Nov-2019.
  6. Gibbons J Coding with Asymmetric Numeral Systems Mathematics of Program Construction, (444-465)
  7. Akama K, Nantajeewarawat E and Akama T Term Rewriting that Preserves Models in KR-Logic Intelligent Information and Database Systems, (41-52)
  8. ACM
    Reynolds T, Procter A, Harrison W and Allwein G (2019). The Mechanized Marriage of Effects and Monads with Applications to High-assurance Hardware, ACM Transactions on Embedded Computing Systems, 18:1, (1-26), Online publication date: 28-Feb-2019.
  9. ACM
    Havet A, Pires R, Felber P, Pasin M, Rouvoy R and Schiavoni V SecureStreams Proceedings of the 11th ACM International Conference on Distributed and Event-based Systems, (124-133)
  10. Jost S, Vasconcelos P, Florido M and Hammond K (2017). Type-Based Cost Analysis for Lazy Functional Languages, Journal of Automated Reasoning, 59:1, (87-120), Online publication date: 1-Jun-2017.
  11. ACM
    Madhavan R, Kulal S and Kuncak V (2017). Contract-based resource verification for higher-order functions with memoization, ACM SIGPLAN Notices, 52:1, (330-343), Online publication date: 11-May-2017.
  12. Posadas-Durán J, Gómez-Adorno H, Sidorov G, Batyrshin I, Pinto D and Chanona-Hernández L (2017). Application of the distributed document representation in the authorship attribution task for small corpora, Soft Computing - A Fusion of Foundations, Methodologies and Applications, 21:3, (627-639), Online publication date: 1-Feb-2017.
  13. Islam S, Balasubramaniam S, Goyal P, Sati M and Goyal N A Domain Specific Language for Clustering 13th International Conference on Distributed Computing and Internet Technology - Volume 10109, (231-234)
  14. ACM
    Madhavan R, Kulal S and Kuncak V Contract-based resource verification for higher-order functions with memoization Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages, (330-343)
  15. ACM
    Harrison W, Procter A and Allwein G Model-driven design & synthesis of the SHA-256 cryptographic hash function in ReWire Proceedings of the 27th International Symposium on Rapid System Prototyping: Shortening the Path from Specification to Prototype, (114-120)
  16. ACM
    Schmidt-Schauß M and Sabel D Sharing-aware improvements in a call-by-need functional core language Proceedings of the 27th Symposium on the Implementation and Application of Functional Programming Languages, (1-12)
  17. ACM
    Ramsey N (2014). On teaching *how to design programs*, ACM SIGPLAN Notices, 49:9, (153-166), Online publication date: 26-Nov-2014.
  18. ACM
    Ramsey N On teaching *how to design programs* Proceedings of the 19th ACM SIGPLAN international conference on Functional programming, (153-166)
  19. Loidl H and Singer J (2014). SICSA multicore challenge editorial preface, Concurrency and Computation: Practice & Experience, 26:4, (929-934), Online publication date: 25-Mar-2014.
  20. ACM
    Hackett J, Hutton G and Jaskelioff M The Under-Performing Unfold Proceedings of the 25th symposium on Implementation and Application of Functional Languages, (4321-4332)
  21. Mol M and Eekelen M Beautiful Code, Beautiful Proof? Essays Dedicated to Rinus Plasmeijer on the Occasion of His 61st Birthday on The Beauty of Functional Code - Volume 8106, (1-7)
  22. ACM
    Mayer C, Hanenberg S, Robbes R, Tanter É and Stefik A (2012). An empirical study of the influence of static type systems on the usability of undocumented software, ACM SIGPLAN Notices, 47:10, (683-702), Online publication date: 15-Nov-2012.
  23. ACM
    Tripathy B and Gantayat S Some new properties of lists and a framework of a list theoretic relation model Proceedings of the Second International Conference on Computational Science, Engineering and Information Technology, (165-170)
  24. ACM
    Mayer C, Hanenberg S, Robbes R, Tanter É and Stefik A An empirical study of the influence of static type systems on the usability of undocumented software Proceedings of the ACM international conference on Object oriented programming systems languages and applications, (683-702)
  25. Komendantsky V Matching Problem for Regular Expressions with Variables Proceedings of the 2012 Conference on Trends in Functional Programming - Volume 7829, (149-166)
  26. Turner D Some History of Functional Programming Languages Proceedings of the 2012 Conference on Trends in Functional Programming - Volume 7829, (1-20)
  27. Bailes P and Brough L Making sense of recursion patterns Proceedings of the First International Workshop on Formal Methods in Software Engineering: Rigorous and Agile Approaches, (16-22)
  28. Butterfield A Reasoning about i/o in functional programs Proceedings of the 4th Summer School conference on Central European Functional Programming School, (93-141)
  29. Conti J and Russo A A taint mode for python via a library Proceedings of the 15th Nordic conference on Information Security Technology for Applications, (210-222)
  30. ACM
    Krishnaswami N, Birkedal L and Aldrich J Verifying event-driven programs using ramified frame properties Proceedings of the 5th ACM SIGPLAN workshop on Types in language design and implementation, (63-76)
  31. Gaboardi M and Péchoux R Upper bounds on stream I/O using semantic interpretations Proceedings of the 23rd CSL international conference and 18th EACSL Annual conference on Computer science logic, (271-286)
  32. ACM
    Cortés H, García M, Hernández J, Hernández M, Pérez-Cordoba E and Ramos E Development of a distributed system applied to teaching and learning Proceedings of the 8th ACM SIGPLAN workshop on ERLANG, (41-50)
  33. ACM
    Marion J and Péchoux R (2009). Sup-interpretations, a semantic method for static analysis of program resources, ACM Transactions on Computational Logic, 10:4, (1-31), Online publication date: 1-Aug-2009.
  34. ACM
    Tate R, Stepp M, Tatlock Z and Lerner S (2009). Equality saturation, ACM SIGPLAN Notices, 44:1, (264-276), Online publication date: 21-Jan-2009.
  35. ACM
    Tate R, Stepp M, Tatlock Z and Lerner S Equality saturation Proceedings of the 36th annual ACM SIGPLAN-SIGACT symposium on Principles of programming languages, (264-276)
  36. Asarin E, Pace G, Schneider G and Yovine S (2008). Algorithmic analysis of polygonal hybrid systems, Part II, Theoretical Computer Science, 390:1, (1-26), Online publication date: 1-Jan-2008.
  37. ACM
    Swierstra W and Altenkirch T Beauty in the beast Proceedings of the ACM SIGPLAN workshop on Haskell workshop, (25-36)
  38. ACM
    Hudak P, Hughes J, Peyton Jones S and Wadler P A history of Haskell Proceedings of the third ACM SIGPLAN conference on History of programming languages, (12-1-12-55)
  39. Lopez-Herrejon R and Apel S Measuring and characterizing crosscutting in aspect-based programs Proceedings of the 10th international conference on Fundamental approaches to software engineering, (423-437)
  40. Jorge J, Gulias V and Castro L Verification of program properties using different theorem provers Proceedings of the 11th international conference on Computer aided systems theory, (233-240)
  41. Maurer D Lazy execution of boolean queries Program analysis and compilation, theory and practice, (82-96)
  42. ACM
    Wang B and Pronk C (2006). Design and implementation of a GUI for the TLC model checker, ACM SIGPLAN Notices, 41:12, (38-43), Online publication date: 1-Dec-2006.
  43. Damaj I (2006). Parallel algorithms development for programmable logic devices, Advances in Engineering Software, 37:9, (561-582), Online publication date: 1-Sep-2006.
  44. Neumann T, Helmer S and Moerkotte G On the optimal ordering of maps, selections, and joins under factorization Proceedings of the 23rd British National Conference on Databases, conference on Flexible and Efficient Information Handling, (115-126)
  45. Gibbons J Fission for program comprehension Proceedings of the 8th international conference on Mathematics of Program Construction, (162-179)
  46. Ho W (2006). An Operational Domain-theoretic Treatment of Recursive Types, Electronic Notes in Theoretical Computer Science (ENTCS), 158, (237-259), Online publication date: 1-May-2006.
  47. ACM
    Dekker A (2006). Lazy functional programming in Java, ACM SIGPLAN Notices, 41:3, (30-39), Online publication date: 1-Mar-2006.
  48. Gibbons J and Hutton G (2005). Proof Methods for Corecursive Programs, Fundamenta Informaticae, 66:4, (353-366), Online publication date: 1-Dec-2005.
  49. ACM
    Bird R Polymorphic string matching Proceedings of the 2005 ACM SIGPLAN workshop on Haskell, (110-115)
  50. Jorge J, Gulías V, Freire J and Sánchez J Towards a certified and efficient computing of gröbner bases Proceedings of the 10th international conference on Computer Aided Systems Theory, (111-120)
  51. Gibbons J and Hutton G (2005). Proof Methods for Corecursive Programs, Fundamenta Informaticae, 66:4, (353-366), Online publication date: 1-Jan-2005.
  52. Tripathy B and Pattanaik G (2004). On some properties of lists and fuzzy lists, Information Sciences: an International Journal, 168:1-4, (9-23), Online publication date: 3-Dec-2004.
  53. Escardó M (2004). Synthetic Topology, Electronic Notes in Theoretical Computer Science (ENTCS), 87, (21-156), Online publication date: 1-Nov-2004.
  54. While L and Mildenhall G (2002). An implementation of parallel pattern-matching via concurrent haskell, Australian Computer Science Communications, 24:1, (293-302), Online publication date: 1-Jan-2002.
  55. While L and Mildenhall G An implementation of parallel pattern-matching via concurrent haskell Proceedings of the twenty-fifth Australasian conference on Computer science - Volume 4, (293-302)
  56. Gao P and Esser R (2001). Polymorphic CSP type checking, Australian Computer Science Communications, 23:1, (156-162), Online publication date: 1-Jan-2001.
  57. ACM
    Hinze R (2000). Deriving backtracking monad transformers, ACM SIGPLAN Notices, 35:9, (186-197), Online publication date: 1-Sep-2000.
  58. ACM
    Elliott C Declarative event-oriented programming Proceedings of the 2nd ACM SIGPLAN international conference on Principles and practice of declarative programming, (56-67)
  59. ACM
    Hinze R Deriving backtracking monad transformers Proceedings of the fifth ACM SIGPLAN international conference on Functional programming, (186-197)
  60. Philipps J and Slotosch O The Quest for Correct Systems Proceedings of the Sixth Asia Pacific Software Engineering Conference
  61. Wakeling D (1999). Compiling lazy functional programs for the Java Virtual Machine, Journal of Functional Programming, 9:6, (579-603), Online publication date: 1-Nov-1999.
  62. Hutton G (1999). A tutorial on the universality and expressiveness of fold, Journal of Functional Programming, 9:4, (355-372), Online publication date: 1-Jul-1999.
  63. ACM
    Reid A, Peterson J, Hager G and Hudak P Prototyping real-time vision systems Proceedings of the 21st international conference on Software engineering, (484-493)
  64. ACM
    Wallace M and Runciman C (1998). The bits between the lambdas, ACM SIGPLAN Notices, 34:3, (107-117), Online publication date: 1-Mar-1999.
  65. ACM
    Marcos D, Martínez López P and Risi W (1998). A functional programming approach to hypermedia authoring, ACM SIGPLAN Notices, 34:1, (346), Online publication date: 1-Jan-1999.
  66. ACM
    Gibbons J and Jones G (1998). The under-appreciated unfold, ACM SIGPLAN Notices, 34:1, (273-279), Online publication date: 1-Jan-1999.
  67. ACM
    Sobel J and Friedman D (1998). Recycling continuations, ACM SIGPLAN Notices, 34:1, (251-260), Online publication date: 1-Jan-1999.
  68. ACM
    Wallace M and Runciman C The bits between the lambdas Proceedings of the 1st international symposium on Memory management, (107-117)
  69. ACM
    Marcos D, Martínez López P and Risi W A functional programming approach to hypermedia authoring Proceedings of the third ACM SIGPLAN international conference on Functional programming
  70. ACM
    Gibbons J and Jones G The under-appreciated unfold Proceedings of the third ACM SIGPLAN international conference on Functional programming, (273-279)
  71. ACM
    Sobel J and Friedman D Recycling continuations Proceedings of the third ACM SIGPLAN international conference on Functional programming, (251-260)
  72. Frank A and Raubal M (1998). Formal specification of image schemata -- a steptowards interoperability in geographic informationsystems, Spatial Cognition and Computation, 1:1, (67-101), Online publication date: 1-Jan-1998.
  73. ACM
    Krasnogor N, Martínez López P, Mocciola P and Pelta D (1997). Protein folding meets functional programming (poster), ACM SIGPLAN Notices, 32:8, (313), Online publication date: 1-Aug-1997.
  74. ACM
    Krasnogor N, Martínez López P, Mocciola P and Pelta D Protein folding meets functional programming (poster) Proceedings of the second ACM SIGPLAN international conference on Functional programming
  75. Matsuura S, Kuruma H and Honiden S (1997). EVA, IEEE Transactions on Software Engineering, 23:5, (296-313), Online publication date: 1-May-1997.
  76. ACM
    Odersky M and Wadler P Pizza into Java Proceedings of the 24th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, (146-159)
  77. ACM
    Meijer E and Hutton G Bananas in space Proceedings of the seventh international conference on Functional programming languages and computer architecture, (324-333)
  78. ACM
    Jeuring J and Swierstra D Constructing functional programs for grammar analysis problems Proceedings of the seventh international conference on Functional programming languages and computer architecture, (259-269)
  79. ACM
    Yuen C (1995). A functional FOR loop, ACM SIGPLAN Notices, 30:9, (21-24), Online publication date: 1-Sep-1995.
  80. ACM
    Kühne T (1995). Higher order objects in pure object-oriented languages, ACM SIGPLAN OOPS Messenger, 6:1, (1-6), Online publication date: 11-Jan-1995.
  81. Díaz J and Shenoi K (1995). Domain Decomposition and Schur Complement Approaches to Coupling the Well Equations in Reservoir Simulation, SIAM Journal on Scientific Computing, 16:1, (29-39), Online publication date: 1-Jan-1995.
  82. Luk W and Wu T Towards a declarative framework for hardware-software codesign Proceedings of the 3rd international workshop on Hardware/software co-design, (181-188)
  83. Poulovassilis A and Small C Investigation of Algebraic Query Optimisation Techniques for Database Programming Languages Proceedings of the 20th International Conference on Very Large Data Bases, (415-426)
  84. ACM
    Yuen C and Feng M (1994). Breadth-first search in the Eight Queens Problem, ACM SIGPLAN Notices, 29:9, (51-55), Online publication date: 1-Sep-1994.
  85. ACM
    Kühne T (1994). Higher order objects in pure object-oriented languages, ACM SIGPLAN Notices, 29:7, (15-20), Online publication date: 1-Jul-1994.
  86. ACM
    Goblirsch D An introduction to Haskell with applications to digital signal processing Proceedings of the 1994 ACM symposium on Applied computing, (425-430)
  87. Jeuring J (1994). The derivation of on-line algorithms, with an application to finding palindromes, Algorithmica, 11:2, (146-184), Online publication date: 1-Feb-1994.
  88. Cunningham H and Cai Y Specification and refinement of a message router Proceedings of the 7th international workshop on Software specification and design, (20-29)
  89. ACM
    Finne S and Burn G Assessing the evaluation transformer model of reduction on the spineless G-machine Proceedings of the conference on Functional programming languages and computer architecture, (331-340)
  90. ACM
    Gill A, Launchbury J and Peyton Jones S A short cut to deforestation Proceedings of the conference on Functional programming languages and computer architecture, (223-232)
  91. ACM
    Gordon A An operational semantics for I/O in a lazy functional language Proceedings of the conference on Functional programming languages and computer architecture, (136-145)
  92. ACM
    Kozato Y and Otto G Benchmarking real-life image processing programs in lazy functional languages Proceedings of the conference on Functional programming languages and computer architecture, (18-27)
  93. ACM
    Passia J and Löhr K (1993). Fips, ACM SIGPLAN Notices, 28:5, (39-48), Online publication date: 1-May-1993.
  94. ACM
    Datta A and Mateti P Automating the re-declaration of unneeded globals as private Proceedings of the 1993 ACM/SIGAPP symposium on Applied computing: states of the art and practice, (87-94)
  95. ACM
    Escardó M (1993). On lazy natural numbers with applications to computability theory and functional programming, ACM SIGACT News, 24:1, (61-67), Online publication date: 15-Jan-1993.
  96. ACM
    Bailes P, Johnston D, Salzman E and Wang L Full functional programming in a declarative Ada dialect Proceedings of the conference on TRI-Ada '92, (350-358)
  97. ACM
    Mody R (1992). Functional programming is not self-modifying code, ACM SIGPLAN Notices, 27:11, (13-14), Online publication date: 1-Nov-1992.
  98. ACM
    Yuen C (1992). Hamming numbers, lazy evaluation, and eager disposal, ACM SIGPLAN Notices, 27:8, (71-75), Online publication date: 1-Aug-1992.
  99. ACM
    Gfeller M (1992). Walks into the APL design space, ACM SIGAPL APL Quote Quad, 23:1, (70-77), Online publication date: 15-Jul-1992.
  100. ACM
    Gfeller M Walks into the APL design space Proceedings of the international conference on APL, (70-77)
  101. ACM
    Piotrowski J (1992). Translation—an introductory exercise, ACM SIGCSE Bulletin, 24:2, (20-28), Online publication date: 1-Jun-1992.
  102. ACM
    Hudak P and Fasel J (1992). A gentle introduction to Haskell, ACM SIGPLAN Notices, 27:5, (1-52), Online publication date: 1-May-1992.
  103. ACM
    Wainwright R (1992). Introducing functional programming in discrete mathematics, ACM SIGCSE Bulletin, 24:1, (147-152), Online publication date: 1-Mar-1992.
  104. ACM
    Wainwright R Introducing functional programming in discrete mathematics Proceedings of the twenty-third SIGCSE technical symposium on Computer science education, (147-152)
  105. ACM
    Jørgensen J Generating a compiler for a lazy language by partial evaluation Proceedings of the 19th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, (258-268)
  106. ACM
    Wadler P The essence of functional programming Proceedings of the 19th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, (1-14)
  107. ACM
    Stanchev S and Radensky A (1991). Teaching some modern functional programming concepts, ACM SIGCSE Bulletin, 23:4, (31-36), Online publication date: 1-Nov-1991.
  108. ACM
    Lapalme G (1991). Implementation of a “Lisp comprehension” macro, ACM SIGPLAN Lisp Pointers, IV:2, (16-23), Online publication date: 1-Apr-1991.
  109. ACM
    Gries D (1991). Teaching calculation and discrimination, Communications of the ACM, 34:3, (44-55), Online publication date: 1-Mar-1991.
  110. ACM
    Bailes P, Johnson D, Salzman E and Wang L DAda—an Ada preprocessor for functional programming Proceedings of the conference on TRI-ADA '90, (114-123)
  111. ACM
    De Man J (1990). Making languages more powerful by removing limitations, ACM SIGSOFT Software Engineering Notes, 15:4, (18-24), Online publication date: 1-Sep-1990.
  112. ACM
    Wadler P Comprehending monads Proceedings of the 1990 ACM conference on LISP and functional programming, (61-78)
  113. ACM
    De Man J Making languages more powerful by removing limitations Conference proceedings on Formal methods in software development, (18-24)
  114. ACM
    Wadler P Theorems for free! Proceedings of the fourth international conference on Functional programming languages and computer architecture, (347-359)
  115. ACM
    Piotrowski J (1989). Abstract machines in miranda, ACM SIGCSE Bulletin, 21:3, (44-47), Online publication date: 1-Sep-1989.
  116. ACM
    Thompson S (1989). Functional programming: executable specifications and program transformations, ACM SIGSOFT Software Engineering Notes, 14:3, (287-290), Online publication date: 1-May-1989.
  117. ACM
    Thompson S Functional programming: executable specifications and program transformations Proceedings of the 5th international workshop on Software specification and design, (287-290)
Contributors
  • University of Oxford
  • The University of Edinburgh

Recommendations

Reviews

Simon John Thompson

Functional programming is of growing importance, especially in university computer science programs. In particular, it is taught at most British universities, and a functional programming language is the first language many British students study. In general, the subject has reached a mature point, having two bi-annual conferences, a number of journals, and implementations of a commercial quality. It is worth reviewing exactly what is meant by functional programming, since this phrase has meant different things at different times. Functional programming involves the definition of data objects, including functions, that can then be evaluated to give results. The definitions are explicit and usually resemble equations, in contrast to the implicit functions defined by commands in imperative languages. Because of this, functional languages tend to be higher-level, giving shorter, more readable code. More important, because the programs are equations, it is easy to see how proofs of correctness can be written: simply infer consequences of the equations given. In a similar way, programs can be transformed from inefficient to more efficient versions. In the last five years or so, a convergence of ideas has become manifest in the languages Haskell [1], Hope [2], Miranda [3], and Standard ML [4,5] (to name the most important). These languages allow functions to be first class citizens, or in other words, to be passed as arguments to or returned as results by functions. A simple example of such a higher order function is map, which takes a function f as its argument and returns the function that applies f to every member of a list. These languages are strongly and statically typed, with all errors reported before evaluation. This typing is not as restrictive as might first be thought because functions can have polymorphic type, meaning that they may be used over a collection of different types without compromising type security. The map function is an instance of this—the function f can be of any type, the only proviso being that map f is applied to a list of elements of the same type as the domain of f. To support large-scale programming, the languages contain module systems of varying degrees of sophistication. It would be wrong to think that these languages are all the same. Some, like Standard ML, contain non-functional features like assignment, although many authors lay stress on their functional subsets. A fundamental difference lies in their approach to evaluation. Traditionally, function arguments are evaluated before being passed to the body (the strict evaluation discipline), but this need not be done. Arguments can be evaluated when and as they are needed. If this is done efficiently, evaluation is lazy ; lazy languages like Haskell and Miranda allow novel methods of programming using infinite lists and the like. One language that is clearly not functional in the sense of this review is LISP. The LISP tradition is long and honorable, but quite distinct, as LISP is both weakly typed and used in an inherently imperative way. Despite the growing interest in functional programming, the number of books on programming in this style is small. Moreover, I find it curious that many of them devote substantial space to discussions of either implementations or the foundations of the subject, such as the lambda calculus; it would be unusual to open a book on imperative programming to find chapters on compiler construction or Turing machines. The books chosen for review here, however, concentrate on programming. Bailey Baileys introductory text gives a thorough treatment of functional programming in Hope. The book aims to start from scratch, and succeeds, taking the student slowly through topics like the development of simple recursive definitions of functions, which might receive a more rapid treatment in other texts. More novel ideas, such as functions as arguments and functions as results, are treated in the latter half of the book, with an early concentration on more concrete, first-order aspects. This focus has the disadvantage that only on page 187 can the author introduce examples of “true functional programming” in its entirety. Table 1: Quantitative data Bailey Bird & Wadler Holyer Paulson Reade Sokolowski Wikstrom Number of pages 300 300 225 420 600 250 450 Number of chapters 9 9 9 10 14 11 23 Number of exercises 109 272 49 301 240 41 232 Solutions to exercises All None None None 50% All All Bibliography (pages) 0 1 1 3 10 4 (annotated) 2 Another distinctive feature is the treatment of evaluation—the author gives a number of simulated evaluations that are useful both in creating an insight into this style of programming and in efficiency estimations. A drawback of this operational approach is that nothing is seen of program transformation or verification, which are among the distinctive features of the paradigm. The book also includes a summary of the Hope language. The main drawback of this text is its lack of larger examples, either in the text itself or in the exercises, which are mainly of the form “write a function to do…” and therefore can give little insight into the software engineering aspects of the topic. Nonetheless, this book is a clear and readable introduction to the basics of functional programming. Bird and Wadler This text introduces a notation that is close to the Miranda programming language (indeed closer than the appendix discussing the differences suggests, as Miranda has been modified somewhat since publication of the book). It is clearly written and covers all important aspects of lazy functional programming, as well as containing many relevant examples. One of its major advantages is that it is not always looking over its shoulder at the imperative paradigm, comparing approaches—it develops functional programming as a coherent approach to programming in itself. The authors approach is sophisticated: they state that their primary aim is “to convey a view of programming as a mathematical activity,” with mathematical reasoning (about programs) lying at the heart of the subject. In a number of places they emphasize the synthesis of programs from their specifications, using libraries of “laws” to guide their proofs. These methods are complex, and it could be argued that they belong more to a second course in programming than to an introduction. In other situations the authors go from the abstract to the concrete, the most obvious example being the introduction of the recursion operator over lists, foldr, before explicit recursion has been used. Clearly the foldr approach is elegant, but in my experience students only learn to use foldr properly after writing recursive definitions for themselves, moving from the concrete to the abstract. Some of the highlights of the book come in the examples, which exploit laziness to give strategies for game playing and so forth. The authors also make many perceptive comments on the novel ways in which programs can be modularized in lazy systems. Despite its more abstract approach, the book can be recommended as a course text that would nicely complement a more concrete approach taken in lectures and classes. Experienced functional programmers can also learn from this book, especially about the elegance and power of the transformational approach. Holyer Holyers text gives complete coverage of the Miranda programming language and system, including modules and the operating system interface as well as a useful list of Miranda standard definitions. He includes three interesting case studies—a personal notebook, a telephone exchange simulation, and a small expert system—which together show that functional programming is of wider than mathematical applicability. He also gives some good hints on program design and on how imperative and functional programming are related. He carefully explains how expressions are evaluated, which gives a clear insight into the different time and space behaviors of various functions. The final chapters discuss various implementation issues, semantics, and other functional languages. Holyer also provides a Miranda library. On the other hand, the book has a number of drawbacks. The second chapter is a feature-by-feature account of the language; it contains relatively few examples and exercises to illustrate the features as they are introduced. The reader is forced to wait until the third and later chapters to see anything substantial. Miranda is strongly typed and, as the author points out, can deduce the types of functions without their being specified. Unfortunately, the author seems to see this as a reason to omit types throughout the book, thereby sacrificing clarity for brevity. Table 2: Qualitative data Bailey Bird & Wadler Holyer Paulson Reade Sokolowski Wikstrom Prerequisites: Imperative programming No No Some Yes Yes Yes No Discrete math No Yes No Yes No Yes No Languages Hope Miranda Miranda Standard ML Miranda, Standard ML Standard ML Standard ML Clarity Good Good Good Good Good Reasonable Good Difficulty Easier Harder Easier Harder Easier Harder Easier Depth of coverage Introductory Full Full Full Full Deep but patchy Introductory Case studies 0 4 3 2 large 3 2 1 Another omission concerns the logical reading of functional programs and the ease with which programs can be proven to have certain properties: Holyer gives no proofs of correctness. Despite these drawbacks, this book is solid and could certainly be used as a textbook for a functional programming course that uses Miranda. Paulson Paulson has written a readable guide to functional programming, which will take the reader through all the features of Standard ML, including exceptions, the module system, and imperative reference types; he also takes pains to explain lazy data structures such as lists. The reader clearly needs previous exposure to programming, and the author adopts a cautious approach to novel ideas—for instance, higher-order functions are introduced relatively late. This approach has the drawback of making some of the earlier examples less elegant than they might be, but the author calls on his teaching experience to justify this delay. The exposition is cumulative, with two larger and well-presented case studies at the end of the book drawing on most of the material introduced. The book is also strong on program verification, with a detailed presentation of various program proofs and a realistic summary of the strengths and weaknesses of this approach to software development. A useful aspect of this book is the giant exclamation points that signal explanations of various pitfalls in the ML system: these are of great help to students trying to understand why the compiler has produced a particularly incomprehensible error message, for example. One drawback of this text is the treatment of efficiency. It is discussed throughout, but no tools are provided with which readers can estimate the efficiency of programs they write or see in the book. Syntax charts and predefined idents enhance the book. Finally, the authors style can be both elegant and caustic. Reade Although the notation used here is close to Standard ML, the authors primary aim is to teach functional programming, so he is happy to add features from other languages, such as list comprehensions and lazy evaluation, when the exposition requires it. The coverage of topics is clear and is supported well by three case studies, two of which are refreshingly nonmathematical in feel: a small graphics package and a “Game of Life” program. Functional languages are often stereotyped as mathematical, so it is good to see examples to the contrary. The author also notes how functional programming techniques can affect programming methodology: printing and processing are completely separate modules in the graphics package, for instance. Despite treating the elementary parts of the subject at a pace accessible to the beginner, the author manages to treat some complex aspects of functional programming, such as a lazy dictionary akin to a Prolog difference list program and general techniques of continuation-based programming. He also gives thorough coverage of program verification. Perhaps one drawback is the relatively late introduction of lists—this means that when higher-order functions and polymorphism are first discussed, many of the natural examples cannot be introduced. Efficiency is also discussed later than it might be, but this delay is partly because any discussion of efficiency must wait until a formal execution model has been described. Sokolowski This book is somewhat eccentric. In the introduction the author states that it is not a handbook, a reference guide, or a beginners guide. In fact, he states, “some prior experience with functional programming would also be an advantage.” It can be read as a second course in functional programming, which examines various aspects of this paradigm critically. The author begins with a long discussion of the relationship between functional and imperative programming, and then examines the type system of Standard ML (and implicitly other languages, including Miranda). He points out a number of drawbacks of the type system as it stands, and gives examples of how it might be extended. Finally, he gives a straightforward introduction to the module system before tersely discussing extended examples from the field of implementation. It would be difficult to recommend this book as a text for a first course, but to someone experienced in functional programming, it provides some interesting insights. Wikstro¨m The book is intended primarily for beginners, and as such succeeds. It contains enough of the general material found in first courses (what is a computer, what is syntax, and so on) that it could be used as the introductory text in most computing programs. It is based solely on Standard ML and omits the languages more complex features, such as exceptions, reference types, and modules. The author takes pains to explain new ideas as he introduces them; his treatment of higher-order functions as things that are “partially applicable” is especially clear. Evaluation is treated formally, through an axiomatic (or structured) operational semantics for the language. This treatment is rigorous and gives the system a sound basis. The only drawback is that the equational aspect of functional programming is treated late, and does not receive the emphasis given in other texts. A larger example appears at the end of the book. This example is well done, with the only disadvantage being its use of the ML IO system, which is neither referentially transparent nor simple to understand. Supplementary material includes an early version of the Standard ML language definition and a glossary of functional programming terms. Comparison For the complete beginner in computing, both Wikstro¨m and Bailey provide gentle introductions to the subject, even if they fail to cover some more advanced material. Bird and Wadler also provide a beginners text, but it is suitable only for those who have a strong mathematical background or at least will be happy with a more formal treatment. (Of course, a lecturer does not have to teach only in the style of the textbook used—a more concrete approach could use Bird and Wadler as an adjunct.) The advantage of Bird and Wadlers book is that they manage to convey some of the distinctive features of functional programming through their approach and examples. Even though Reade and Paulson both require some background in imperative programming, they write in different yet accessible styles, and either would be most suitable for an early course in functional programming. Reade gives slightly broader coverage of functional programming constructs, and Paulson gives slightly broader coverage of the non-functional aspects of ML, but both cover the basic material and their case studies competently. Holyer gives broad coverage of Miranda; the order of presentation is a drawback, but lecturers can decide how to use the book. Sokolowski provides an interesting perspective on functional programming, but only as a second course on the subject.

Access critical reviews of Computing literature here

Become a reviewer for Computing Reviews.