skip to main content
article
Free Access

Conception, evolution, and application of functional programming languages

Published:01 September 1989Publication History
Skip Abstract Section

Abstract

The foundations of functional programming languages are examined from both historical and technical perspectives. Their evolution is traced through several critical periods: early work on lambda calculus and combinatory calculus, Lisp, Iswim, FP, ML, and modern functional languages such as Miranda1 and Haskell. The fundamental premises on which the functional programming methodology stands are critically analyzed with respect to philosophical, theoretical, and pragmatic concerns. Particular attention is paid to the main features that characterize modern functional languages: higher-order functions, lazy evaluation, equations and pattern matching, strong static typing and type inference, and data abstraction. In addition, current research areas—such as parallelism, nondeterminism, input/output, and state-oriented computations—are examined with the goal of predicting the future development and application of functional languages.

References

  1. AASA, A., HOLMSTROM, $., AND NILSSON, C. 1987. An efficiency comparison of some representations of purely functional arrays. Tech. Rep. 33. Programming Methodology Group, Chalmers University of Technology.Google ScholarGoogle Scholar
  2. ABELSON, H., SUSSMAN, G. J., AND SUSSMAN, J. 1985. Structure and Interpretation of Computer Programs. The MIT Press, Cambridge, Mass., and McGraw-Hill New York. Google ScholarGoogle Scholar
  3. ACKERMAN, W. B., AND DENNIS, J. B. 1979. VAL-- A value-oriented algorithmic language preliminary reference manual. Laboratory for Computer Science MIT/LCS/TR-218, MIT. Google ScholarGoogle Scholar
  4. ANDERSON, $., AND HUDAK, P. 1989. Efficient compilation of Haskell array comprehensions. Tech. Rep. YALEU/DCS/RR693. Yale University, Department of Computer Science.Google ScholarGoogle Scholar
  5. APPEL, A. W., AND MACQUEEN, D. B. 1987. A standard ML compiler. In Proceedings of the 1987 Functional Programming Languages and Computer Architecture Conference (Sept. 1987). Springer-Verlag LNCS 274, iFIP pp. 301-324. Google ScholarGoogle Scholar
  6. ARVIND AND GOSTELOW, K. P. 1977. A computer capable of exchanging processors for time. In Proceedings IFIP Congress, pp. 849-853.Google ScholarGoogle Scholar
  7. ARVIND AND GOSTELOW, K. P. 1982. The U-interpreter. Computer 15, 2, 42-50.Google ScholarGoogle Scholar
  8. ARVIND AND KATHAIL, V. 1981. A multiple processor data flow machine that supports generalized procedures. In Proceedings of the 8th Annual Symposium on Computer Architecture. Vol. 9, No. 3. ACM SIGARCH, pp. 291-302. Google ScholarGoogle Scholar
  9. ASHCROFT, r. A., AND WADGE, W. W. 1976a. Lucid--A formal system for writing and proving programs. SIAM J. Comput. 5, 3, 336-354.Google ScholarGoogle Scholar
  10. ASHCROFT, E. A., AND WADGE, W. W. 1976b. Lucid, a nonprocedural language with iteration. Commun. ACM 20, 519-526. Google ScholarGoogle Scholar
  11. AUGUSTSSON, L. 1984. A compiler for Lazy ML. In Proceedings 1984 A CM Conference on LISP and Functional Programming (August). ACM, pp. 218-227. Google ScholarGoogle Scholar
  12. AUGUSTSSON, L. 1985. Compilingpattern-matching. In Functional Programming Languages and Computer Architecture. Springer-Verlag LNCS 201, pp. 368-381. Google ScholarGoogle Scholar
  13. BACKUS, J. 1978. Can programming be liberated from the von Neumann style? A functional style and its algebra of programs. Commun. ACM 21, 8, 613-641. Google ScholarGoogle Scholar
  14. BACKUS, J., WILLIAMS, J. S., AND WIMMERS, E. L. 1986. FL language manual (preliminary version). Tech. Rep. RJ 5339 (54809). Computer Science, IBM Almaden Research Center, Almaden, CA.Google ScholarGoogle Scholar
  15. BARENDREGT, H. P. 1984. The Lambda Calculus, Its Syntax and Semantics. Revised ed. North- Holland, Amsterdam.Google ScholarGoogle Scholar
  16. BERRY, G. 1978. S~quentialit~ de l'~valuation formelle des ~,-expressions. In Proceedings 3-e Coltoque International SUE la Programmation.Google ScholarGoogle Scholar
  17. BIRD, R., AND WADLER, P. 1988. Introduction to Functional Programming. Prentice Hall, Englewood Cliffs, N.J. Google ScholarGoogle Scholar
  18. BLOSS, A. 1988. Path analysis: Using order-ofevaluation information to optimize lazy functional languages. Ph.D. Dept. Computer Science, dissertation, Yale Univ.Google ScholarGoogle Scholar
  19. BLOSS, A., AND HUDAK, P. 1987. Path semantics. In Proceedings of Third Workshop on the Mathematical Foundations of Programming Language Semantics. Springer-Verlag LNCS (Tulane Univ., April 1987), 298, 476-489. Google ScholarGoogle Scholar
  20. BLOSS, A., HUDAK, P., AND YOUNG, J. 1988. Code optimizations for lazy evaluation. Lisp and Symbolic Computation: An International Journal 1, 147-164.Google ScholarGoogle Scholar
  21. BOEHM, H.-J. 1985. Partial polymorphic type inference is undecidable. In Proceedings of 26th Sympsoium on Foundations of Computer Science. IEEE pp. 339-345.Google ScholarGoogle Scholar
  22. BOUTEL, B. E. 1988. Tui language manual. Tech. Rep. CSD-8-021. Victoria University of Wellington, Department of Computer Science.Google ScholarGoogle Scholar
  23. BURGE, W. H. 1975. Recursive Programming Techniques. Addison-We~ley, Reading, Mass.Google ScholarGoogle Scholar
  24. BURN, G. L., PEYTON JONES, S. L., AND ROBSON, J. D. 1988. The spineless G-machine. In Proceedings 1988 A CM Conference on Lisp and Functional Programming (Salt Lake City, Utah). ACM SIGPLAN/SIGACT/SIGART, 244-258. Google ScholarGoogle Scholar
  25. BURSTALL, R. M., MACQUEEN, D. B., AND SANNELLA, D. T. 1980. HOPE: An experimental applicative language. In The 1980 LISP Conference. Stanford University, Santa Clara Univ. The USP Co., pp. 136-143. Google ScholarGoogle Scholar
  26. BURTON, F. W. 1984. Annotations to control parallelism and reduction order in the distributed evaluation of functional programs. A CM Trans. Program. Lang. Syst. 6, 2, 159-174. Google ScholarGoogle Scholar
  27. BURTON, F. W. 1988. Nondeterminism with referential transparency in functional programming languages. Comput. J. 31, 3, 243-247. Google ScholarGoogle Scholar
  28. CARDELLI, L., AND WEANER, P. 1985. On understanding types, data abstraction, and polymorphism. ACM Comput. Surv. 17, 4, 471-522. Google ScholarGoogle Scholar
  29. CARTWRIGHT, R. 1976. A practical formal semantic definition and verification system for typed Lisp. Tech. Rep. AIM-296. Stanford Artificial Intelligence Laboratory.Google ScholarGoogle Scholar
  30. CnEN, M. C. 1986. Transformations of parallel programs in crystal. In Information Processing '86, Elsevier North-Holland, New York, pp. 455-462.Google ScholarGoogle Scholar
  31. CHURCH, A. 1932-1933. A set of postulates for the foundation of logic. Ann. Math. 2, 33-34, 346- 366, 839-864.Google ScholarGoogle Scholar
  32. CHURCH, A. 1941. The Calculi of Lambda Conversion. Princeton University Press, Princeton, N.J. Google ScholarGoogle Scholar
  33. CHURCH, A., AND ROSSER, J. B. 1936. Some properties of conversion. Trans. Am. Math. Soc. 39, 472-482.Google ScholarGoogle Scholar
  34. CURRY, H. B., AND FEYS, R. 1958. Combinatory Logic. Vol. 1. North-Holland, The Netherlands.Google ScholarGoogle Scholar
  35. DAMAS, L., AND MILNER, R. 1982. Principle type schemes for functional languages. In 9th A CM Symposium on Principles of Programming Languages. ACM. Google ScholarGoogle Scholar
  36. DARLINGTON, J., AND WHILE, L. 1987. Controlling the behavior of functional language systems. In Proceedings of 1987 Functional Programming Languages and Computer Architecture Conference. Springer-Verlag LNCS 274, pp. 278-300. Google ScholarGoogle Scholar
  37. DAVIS, A. L. 1978. The architecture and system method of DDM-I: A recursively structured data driven machine. In Proceedings 5th Annual Symposium on Computer Architecture. IEEE, ACM. Google ScholarGoogle Scholar
  38. DEGROOT, D., AND LINDSTROM, G. 1985. Functional and Logic Programming. Prentice-Hall, EngleP wood Cliffs, N.J.Google ScholarGoogle Scholar
  39. DELOSME, J.-M., AND IPSEN, I. C. F. 1985. An illustration of a methodology for the construction of efficient systolic architectures in VLSI. In Proceedings 2nd International Symposium on VLSI Technology, Systems, and Applications, ITRI, NSC pp. 268-273.Google ScholarGoogle Scholar
  40. DENNIS, J. B., AND MISUNAS, D. P. 1974. A preliminary architecture for a basic datafiow processor. In Proceedings of the 2nd Annual Symposium on Computer Architecture. ACM, IEEE, pp. 126-132. Google ScholarGoogle Scholar
  41. FAmBAIRN, J. 1985. Design and implementation of a simple typed language based on the lambda calculus. Ph.D. dissertation, Univ. of Cambridge. Available as Computer Laboratory TR No. 75.Google ScholarGoogle Scholar
  42. FAIRBAIRN, J., AND WRAY, S. 1987. Tim: A simple, lazy abstract machine to execute supercombinatoes. In Proceedings of 1987 Functional Programming Languages and Computer Architecture Conference. Springer Verlag LNCS 274, pp. 34-45. Google ScholarGoogle Scholar
  43. FIELD, A. J., AND HARRISON, P. G. 1988. Functional Programming. Addison-Wesley, Workingham, England.Google ScholarGoogle Scholar
  44. FORTUNE, S., LEIVANT, D., AND O'DONNELL, M. 1985. The expressiveness of simple and secondorder type structures. J. ACM 30, 1, 151-185. Google ScholarGoogle Scholar
  45. FRIEDMAN, D. P., AND WISE, D. $. 1976. Cons should not evaluate its arguments. In Automata, Languages and Programming, Edinburgh University Press, pp. 257-284.Google ScholarGoogle Scholar
  46. GELERNTER, H., HANSEN, J. R., AND GERBERICH, C. L. 1960. A FORTRAN-compiled list processing language. J. ACM 7, 2, 87-101. Google ScholarGoogle Scholar
  47. GIFFORD, D. K., AND LUCASSEN, J. M. 1986. Integrating functional and imperative programming. In Proceedings 1986 A CM Conference on Lisp and Functional Programming. ACM SIG- PLAN/SIGACT/SIGART, pp. 28-38. Google ScholarGoogle Scholar
  48. GIRARD, J.-Y. 1972. Interpretation Fonctionelle et Elimination des Coupures dans l'Arithm~tique d'Ordre Sup~rieur. Ph.D. dissertation, Univ. of Paris.Google ScholarGoogle Scholar
  49. GOLDBERO, B. 1988a. Buckwheat: Graph reduction on a shared memory multiprocessor. In Proceedings 1988 A CM Conference on Lisp and Functional Programming (Salt Lake City, Utah, August 1988) ACM SIGPLAN/SIGACT/SIGART. Google ScholarGoogle Scholar
  50. GOLDBERG, B. 1988b. Multiprocessor execution of functional programs. Ph.D. dissertation, Dept. of Computer Science, Yale Univ. Available as Tech. Rep. YALEU/DCS/RR-618. Google ScholarGoogle Scholar
  51. GOLDBERG, B., AND HUDAK, P. 1988. Implementing functional programs on a hypercube multiprocessor. In Proceedings of 3rd Conference on Hypercube Concurrent Computers and Applications. ACM. Google ScholarGoogle Scholar
  52. GORDON, M. J., MILNER, R., AND WADSWORTH, C. P. 1979. Edinburgh LCF. Springer-Verlag LNCS 78, Berlin.Google ScholarGoogle Scholar
  53. GORDON, M., MILNER, R., MORRIS, L., NEWEY, M., AND WADSWORTH, C. 1978. A metalanguage for interactive proof in LCF. In Conference Record of the 5th Annual A CM Symposium on Principles of Programming Languages. ACM, pp. 119-130. Google ScholarGoogle Scholar
  54. GUTTAG, J., HORNING, J., AND WILLIAMS, J. 1981. FP with data abstraction and strong typing. In Proceedings of the 1981 Conference on Functional Programming Languages and Computer Architecture. ACM, pp. 11-24. Google ScholarGoogle Scholar
  55. HANCOCK, P. 1987. Polymorphic type-checking. In The Implementation of Functional Programming Languages, S. L. Peyton Jones, Ed. Prentice-Hall International, Englewood Cliffs, N.J., Chapters 8 and 9.Google ScholarGoogle Scholar
  56. HENDERSON, P. 1980. Functional Programming: Application and Implementation. Prentice-Hall, Englewood Cliffs, N.J. Google ScholarGoogle Scholar
  57. HENDERSON, P. 1982. Purely functional operating systems. In Functional Programming and Its Applications: An Advance Course. Cambridge University Press, pp. 177-192.Google ScholarGoogle Scholar
  58. HENDERSON, P. AND MORRIS, r. 1976. A lazy evaluator. In 3rd A CM Symposium on Principles of Programming Languages. ACM, pp. 95-103. Google ScholarGoogle Scholar
  59. HINDLEY, R. 1969. The principle type scheme of an object in combinatory logic. Trans. Amer. Math. Soc. 146, 29-60.Google ScholarGoogle Scholar
  60. HOLMSTROM, S. 1983. How to handle large data structures in functional languages. In Proceedings of SERC/Chalmers Workshop on Declarative Programming Languages. SERC.Google ScholarGoogle Scholar
  61. HUDAK, P. 1984. ALFL Reference Manual and Programmer's Guide. 2nd ed. Res. Rep. YALEU/ DCS/RR-322. Yale University.Google ScholarGoogle Scholar
  62. HUDAK, P. 1986a. Arrays, non-determinism, sideeffects, and parallelism: a functional perspective. In Proceedings of the Santa Fe Graph Reduction Workshop (Los Alamos/MCC). Springer-Verlag LNCS 279, pp. 312-327. Google ScholarGoogle Scholar
  63. HUDAK, P. 1986b. Denotational semantics ofa parafunctional programming language. Int. J. Parallel Program. 15, 2, 103-125. Google ScholarGoogle Scholar
  64. HUDAK, P. 1986. Para-functional programming. Computer 19, 8, 60-71. Google ScholarGoogle Scholar
  65. HUDAK, P., AND ANDERSON, S. 1987. Pomset interpretations of parallel functional programs, in Proceedings of 1987 Functional Programming Languages and Computer Architecture Conference. Springer Verlag LNCS 274, pp. 234-256. Google ScholarGoogle Scholar
  66. HUDAK, P., AND ANDERSON, S. 1988. Haskell solutions to the language session problems at the 1988 Salishan high-speed computing conference. Tech. Rep. YALEU/DCS/RR-627. Department of Computer Science, Yale University.Google ScholarGoogle Scholar
  67. HUDAK, P., AND MOHR, E. 1989. Graphinators and the duality of SIMD and MIMD. In Proceedings 1988 A CM Conference on Lisp and Functional Programming (Salt Lake City, Utah, August). ACM SIGPLAN/SIGACT/SIGART. Google ScholarGoogle Scholar
  68. HUDAK, P., AND SUNDARESH, R. 1988. On the expressiveness of purely functional I/O systems. Tech. Rep. YALEU/DCS/RR-665. Department of Computer Science. Yale University.Google ScholarGoogle Scholar
  69. HUDAK, P., AND SMITH, L. 1986. Para-functional programming: A paradigm for programming multiprocessor systems, tn I2th ACM Symposium on Principles of Programming Languages. ACM, pp. 243-254. Google ScholarGoogle Scholar
  70. HUDAK, P., AND WADLER, P. Eds. 1988. Report on the Functional Programming Language Haskell. Tech. Rep. YALEU/DCS/RR656. Department of Computer Science, Yale University.Google ScholarGoogle Scholar
  71. HUGHES, J. 1984. Why functional programming matters. Tech. Rep. 16. Programming Methodology Group, Chalmers University of Technology.Google ScholarGoogle Scholar
  72. HUGHES, J. 1985a. An efficient implementation of purely functional arrays. Tech. Rep. Programming Methodology Group, Chalmers University of Technology.Google ScholarGoogle Scholar
  73. HUGHES, J. 1985b. Lazy memo-functions. In Functional Programming Languages and Computer Architecture. Springer-Verlag LNCS 201, pp. 129-146. Google ScholarGoogle Scholar
  74. IVERSON, K. 1962. A Programming Language. Wiley, New York. Google ScholarGoogle Scholar
  75. JOHNSON, S. D. 1988. Daisy Programming Manual. Tech. Rep. Indiana University Computer Science Department.Google ScholarGoogle Scholar
  76. KAES, S. 1988. Parametric polymorphism. In Proceedings of the 2nd Eupropean Symposium on Programming. Springer-Verlag LNCS 300.Google ScholarGoogle Scholar
  77. KELLER, R. M. 1982. FEL programmer's guide. AMPS TR 7. University of Utah.Google ScholarGoogle Scholar
  78. KELLER, R. M., AND LiNDSTROM, G. 1985. Approaching distributed database implementations through functional programming concepts. In International Conference on Distributed Systems. IEEE.Google ScholarGoogle Scholar
  79. KELLER, R. M., AND SLEEP, R. 1986. Applicative caching. A CM Trans. Program. Lang. Syst. 8, 1, 88-108. Google ScholarGoogle Scholar
  80. KELLER, R. M., JAYARAMAN, B., ROSE, D., AND LINDSTROM, G. 1980. FGLprogrammer's guide. AMPS Tech. Memo 1. Department of Computer Science, University of Utah.Google ScholarGoogle Scholar
  81. KLEENE, S. C. 1936. n-definability and recursiveness. Duke Math. J. 2, 340-353.Google ScholarGoogle Scholar
  82. KLEENE, S. C., AND ROSSER, J. B. 1935. The inconsistency of certain forms of logic. Ann. Math. 2, 36, 630-636.Google ScholarGoogle Scholar
  83. KROEZE, H. J. 1986-1987. The TWENTEL system (version 1). Tech. Rep. Department of Computer Science, University of Twente, The Netherlands.Google ScholarGoogle Scholar
  84. LANDIN, P. J. 1964. The mechanical evaluation of expressions. Comput. J. 6, 4, 308-320.Google ScholarGoogle Scholar
  85. LANDIN, P. J. 1965. A correspondence between ALGOL 60 and Church's lambda notation. Commun. ACM 8, 89-101, 158-165. Google ScholarGoogle Scholar
  86. LANDIN, P. J. 1966. The next 700 programming languages. Commun. ACM 9, 3, 157-166. Google ScholarGoogle Scholar
  87. LUCASSEN, J. M., AND GIFFORD, D. K. 1988. Polymorphic effect systems. In Proceedings of 15th A CM Symposium on Principles of Programming Languages. ACM, pp. 47-57. Google ScholarGoogle Scholar
  88. MARKOV, A. A. 1951. Teoriya algorifmov (Theory of algorithms). Trudy Mat. Inst. Steklov 38, 176-189.Google ScholarGoogle Scholar
  89. MCCARTHY, J. 1960. Recursive functions of symbolic expressions and their computation by machine, Part I. Commun. ACM 3, 4, 184-195. Google ScholarGoogle Scholar
  90. MCCARTHY, J. 1963. A basis for a mathematical theory of computation. In Computer Programming and Formal Systems. North-Holland, The Netherlands, pp. 33-70.Google ScholarGoogle Scholar
  91. MCCARTHY, J. 1978. History of Lisp. In Preprints of Proceedings of A CM SIGPLAN History of Programming Languages Conference. SIGPLAN Notices, Vol. 13, pp. 217-223. Google ScholarGoogle Scholar
  92. MCGRAW, J. R. 1982. The VAL language: Description and analysis. TOPLAS, 4, 1, 44-82. Google ScholarGoogle Scholar
  93. MCGRAW, J., ALLAN, S., GLAUERT, J., AND DOBES, I. 1983. SISAL: Streams and Iteration in a Single- Assignment Language, Language Reference Manual. Tech. Rep. M-146. Lawrence Livermore National Laboratory.Google ScholarGoogle Scholar
  94. MILNE, R. E., AND STRACHEY, C. 1976. A Theory of Programming Language Semantics. Chapman and Hall, London, and John Wiley, New York. Google ScholarGoogle Scholar
  95. MILNER, R. A. 1978. A theory of type polymorphism in programming. J. Comput. Syst. Sci. 17, 3, 348-375.Google ScholarGoogle Scholar
  96. MILNER, R. 1984. A proposal for Standard ML. In Proceedings 1984 A CM Conference on LISP and Functional Programming. ACM, pp. 184-197. Google ScholarGoogle Scholar
  97. MULLIN, L. R. 1988. A mathematics of arrays. Ph.D dissertation, Computer and Information Science and CASE Center, Syracuse University.Google ScholarGoogle Scholar
  98. NIKHIL, R. S., PINGALI, K., AND ARVIND. 1986. Id nouveau. Computation Structures Group Memo 265. Laboratory for Computer Science, Massachusetts Institute of Technology.Google ScholarGoogle Scholar
  99. PEYTON JONES, S. L. 1987. The Implementation of Functional Programming Languages. Prentice- Hall International, Englewood Cliffs, N.J. Google ScholarGoogle Scholar
  100. PEYTON JONES, S. L., CLACK, C., SALKILD, J., AND HARDIE, M. GRIP--A high-performance architecture for parallel graph reduction. In Proceedings of 1987 Functional Programming Languages and Computer Architecture Conference. Springer- Verlag LNCS 274, pp. 98-112. Google ScholarGoogle Scholar
  101. PFENNING, F. 1988. Partial polymorphic type inference and higher-order unification. In Proceedings 1988 A CM Conference on Lisp and Functional Programming (Salt Lake City, Utah). ACM SIG- PLAN/SIGACT/SIGART, pp. 153-163. Google ScholarGoogle Scholar
  102. POST, E.L. Formal reductions of the general combinatorial decision problem. Am. J. Math. 65, 197-215.Google ScholarGoogle Scholar
  103. REES, J., AND CLINGER, W. Eds. 1986. The revised report on the algorithmic language Scheme. SiGPLAN Notices 21, 12, 37-79. Google ScholarGoogle Scholar
  104. REYNOLDS, J. C. 1974. Towards a theory of type structure. In Proceedings of Colloque SUE la Programmation. Springer-Verlag LNCS 19, pp. 408-425. Google ScholarGoogle Scholar
  105. REYNOLDS, J. C. 1985. Three approaches to type structure. In Mathematical Foundations of Software Development, Springer-Verlag LNCS 185, pp. 97-138. Google ScholarGoogle Scholar
  106. ROSSER, J. B. 1982. Highlights of the history of the lambda-calculus. In Proceedings 1982 A CM Conference on LISP and Functional Programming. ACM, pp. 216-225. Google ScholarGoogle Scholar
  107. SCHMIDT, D. A. 1985. Detecting global variables in denotational specifications. ACM Trans. Program. Lang. Syst. 7, 2, 299-310. Google ScholarGoogle Scholar
  108. SCHONrINKEL, M. 1924. Uber die bausteine dee mathematischen logik. Mathematische Annalen 92, 305.Google ScholarGoogle Scholar
  109. SCOTT, D. S. 1970. Outline of a mathematical theory of computation. Programming Research Group PRG-2, Oxford University.Google ScholarGoogle Scholar
  110. SHAPIRO, E. 1989.' Systolic Programming: A Paradigm of Parallel Processing. Department of Applied Mathematics Tech. Rep. CS84-21, The Weizmann Institute of Science.Google ScholarGoogle Scholar
  111. SRIDHARAN, N. S. 1985. Semi-applicative programming: An example. Tech. Rep. BBN Laboratories.Google ScholarGoogle Scholar
  112. STEELE, JR., L. G., AND HILLIS, n. W. 1986. Connection machine lisp: Fine-grained parallel symbolic processing. In Proceedings 1986 A CM Conference on Lisp and Functional Programming (Cambridge, Mass.). ACM SIGPLAN/SIGACT/ SIGART, pp. 279-297. Google ScholarGoogle Scholar
  113. STOY, J. E. 1977. Denotational Semantics: The Scott- Strachey Approach to Programming Language Theory. The MIT Press, Cambridge, Mass. Google ScholarGoogle Scholar
  114. STOYE, W. 1985. A New Scheme for Writing Functional Operating Systems. Tech. Rep. 56. Computer Laboratory, University of Cambridge.Google ScholarGoogle Scholar
  115. THAKKAR, S. S. Ed. 1987. Selected Reprints on Datafiow and Reduction Architectures. The Computer Society Press, Washington, DC. Google ScholarGoogle Scholar
  116. TORTE, M. 1988. Operational semantics and polymorphic type inference. Ph.D. dissertation, Dept. Computer Science, Univ. of Edinburgh (CST-52- 88).Google ScholarGoogle Scholar
  117. TRAKHTENBROT, B. A. 1988. Comparing the Church and Turing approaches: Two prophetic messages. Tech. Rep. 98/88. Eskenasy Institute of Computer Science, Tel-Aviv University.Google ScholarGoogle Scholar
  118. TRELEAVEN, P. C., BROWNBRIDGE, D. R., AND HOP- gINS, R. P. 1982. Data-driven and demanddriven computer architectures. Comput. Surv. 14, 1, 93-143. Google ScholarGoogle Scholar
  119. TU, H-C. 1988. FAC: Functional array calculator and its application to APL and functional programming. Ph.D. dissertation, Dept. Computer Science, Yale Univ. Available as Res. Rep. YALEU/DCS/RR-468. Google ScholarGoogle Scholar
  120. Tu, H-C., AND PERLIS, A. J. 1986. FAC: A functional APL language. IEEE Software 3, 1, 36-45.Google ScholarGoogle Scholar
  121. TURING, A. M. 1936. On computable numbers with an application to the entscheidungsproblem. Proc. London Math. Soc. 42, 230-265.Google ScholarGoogle Scholar
  122. TURING, A. M. 1937. Computability and k-definability. J. Symbolic Logic 2, 153-163.Google ScholarGoogle Scholar
  123. TURNER, D. A. 1976. SASL language manual. Tech. Rep. Univ. St. Andrews.Google ScholarGoogle Scholar
  124. TURNER, U. A. 1979. A new implementation techinque for applicative languages. Softw. Pract. Exper. 9, 31-49.Google ScholarGoogle Scholar
  125. TURNER, D. A. 1981. The semantic elegance of applicative languages. In Proceedings of the 1981 Conference on Functional Programming Languages and Computer Architecture. ACM, pp. 85-92. Google ScholarGoogle Scholar
  126. TURNER, D. A., 1982. Recursion equations as a programming language. In Functional Programming and Its Applications: An Advanced Course. Cambridge University Press, New York, pp. 1-28.Google ScholarGoogle Scholar
  127. TURNER, D. A. 1985. Miranda: A non-strict functional language with polymorphic types. In Functional Programming Languages and Computer Architecture. Springer-Verlag LNCS 201, pp. 1-16. Google ScholarGoogle Scholar
  128. VAN HEIJENOORT, J. 1967. From Frege to GSdel. Harvard University Press, Cambridge, Mass.Google ScholarGoogle Scholar
  129. VEGDAHL, S. R. 1984. A survey of proposed architectures for the execution of functional languages. IEEE Trans. Comput. C-23, 12, 1050-1071.Google ScholarGoogle Scholar
  130. VUILLEMiN, J. 1974. Correct and optimal implementations of recursion in a simple programming language. J. Comput. Syst. Sci. 9, 3.Google ScholarGoogle Scholar
  131. WADGE, W. W., AND ASHCROFT, E. A. 1985. Lucid, the Datafiow Programming Language. Academic Press, London. Google ScholarGoogle Scholar
  132. WADLER, P. 1986. A new array operation. In Workshop on Graph Reduction Techniques, Springer- Verlag LNCS 279. Google ScholarGoogle Scholar
  133. WADLER, P. 1987a. Efficient compilation of patternmatching. In The Implementation of Functional Programming Languages, S. L. Peyton Jones, Ed. Prentice-Hall International, Englewood Cliffs, N.J., Chapter 5.Google ScholarGoogle Scholar
  134. WADLER, P. 1987. Views: A way for pattern-matching to cohabit with data abstraction. Tech. Rep. 34. Programming Methodology Group, Chalmers Univ. of Technology, March 1987. Preliminary version appeared in the Proceedings of the 14th A CM Symposium on Principles of Programming Languages (January 1987). Google ScholarGoogle Scholar
  135. WADLER, P., AND BLOTT, S. 1989. How to make ad hoc polymorphism less ad hoc. In Proceedings of 16th A CM Symposium on Principles of Programming Languages. ACM, pp. 60-76. Google ScholarGoogle Scholar
  136. WADLER, P., AND MILLER, Q. 1988. An introduction to Orwell. Tech. Rep. Programming Research Group, Oxford University. (First version, 1985.)Google ScholarGoogle Scholar
  137. WADSWORTH, C. P. 1971. Semantics andpragmatics of the lambda calculus. Ph.D. dissertation, Oxford Univ.Google ScholarGoogle Scholar
  138. WATSON, P., AND WATSON, I. 1987. Evaluating functional programs on the FLAGSHIP machine. In Proceedings of 1987 Functional Programming Languages and Computer Architecture Conference. Springer-Verlag LNCS 274, pp. 80-97. Google ScholarGoogle Scholar
  139. WEGNER, P. 1968. Programming Languages, in{ormation Structures, and Machine Organization. McGraw-Hill, New York. Google ScholarGoogle Scholar
  140. WIKSTROM, ,A. 1988. Standard ML. Prentice-Hall, Englewood Cliffs, N.J.Google ScholarGoogle Scholar
  141. WISE, D. 1987. Matrix algebra and applicative programming. In Proceedings o{ 1987 Functional Programming Languages and Computer Architecture Conference, Springer Verlag LNCS 274, pp. 134-153. Google ScholarGoogle Scholar
  142. YOUNG, J. 1988. The Semantic Analysis of Functional Programs: Theory and Practice. Ph.D. dissertation, Dept. Computer Science, Yale Univ., 130-142.Google ScholarGoogle Scholar

Recommendations

Reviews

Edward A. Schneider

Papers in Computing Surveys are meant to be surveys or tutorials. This paper serves both purposes for modern functional programming languages, although it does a better job as a survey. A good introduction to these languages is Hughes [1]. The first part of the paper is an excellent overview of the evolution of modern functional languages. The overview starts with the lambda calculus, goes through LISP, Backus's FP, ML and its Hindley-Milner typing, and Turner's SASL and its successors, and finally arrives at Haskell, a language recently designed by an international committee that included Hudak (Haskell is used for the examples in the remainder of the paper). The second section describes four features that distinguish modern functional languages from earlier languages—higher-order functions, lazy evaluation, data abstraction, and equations and pattern matching. The third section discusses recent innovations in functional programming and current research, including several ideas that are being tried in Haskell. These innovations include type classes to manage operator overloading, functional I/O, functional arrays, views (used to separate data representation from pattern matching—these were originally part of Haskell but have been removed), annotations for concurrent execution, explicit caches for memoization, nondeterministic operators, and logic variables. The last part of the paper attempts to dispel several myths about functional programming: functional programming is the antithesis of imperative programming; functional languages are toys; and functional languages cannot deal with state. Overall, the paper is well written and is an excellent summary of the current status of functional programming and how we got here. Some parts may be a little difficult for readers with no experience with functional languages: curried notation is used in the introduction long before it is introduced in the first section, for example. Also, the paper contains several annoyances and typos. For example, Hudak introduces the notation “ e 1 e 2” for application and then gives the notation “[ e 1/ x] e 2,” in which the subscripts are reversed, for substitution. The definition of the LISP function mapcar is poorly formatted. An example for a simple tree of integers is wrong. The type given for readFile is wrong. These problems are minor, however, and I highly recommend this paper to anyone with an interest in functional programming who would like to know the current status of these languages.

Access critical reviews of Computing literature here

Become a reviewer for Computing Reviews.

Comments

Login options

Check if you have access through your login credentials or your institution to get full access on this article.

Sign in

Full Access

  • Published in

    cover image ACM Computing Surveys
    ACM Computing Surveys  Volume 21, Issue 3
    Sep. 1989
    248 pages
    ISSN:0360-0300
    EISSN:1557-7341
    DOI:10.1145/72551
    Issue’s Table of Contents

    Copyright © 1989 ACM

    Publisher

    Association for Computing Machinery

    New York, NY, United States

    Publication History

    • Published: 1 September 1989
    Published in csur Volume 21, Issue 3

    Permissions

    Request permissions about this article.

    Request Permissions

    Check for updates

    Qualifiers

    • article

PDF Format

View or Download as a PDF file.

PDF

eReader

View online with eReader.

eReader