Comparison of functional programming languages
Appearance
The table shows a comparison of functional programming languages which compares various features and designs of different functional programming languages.
Name | Pure | Lazy Evaluation | Typing | Abstract Data Types | Algebraic Data Types | Data is Immutable | Type Classes | Closures |
---|---|---|---|---|---|---|---|---|
Common Lisp | No[1] | Partial, simulated with thunks[2] | Dynamic[3] | Yes[4] | Partial, with extension[5] | No[6] | No | Yes[7] |
Scheme | No[8] | Yes[9] | Dynamic[8] | Yes[10] | Partial, simulated with thunks[11] | No[12] | No | Yes[13] |
Racket | No | Yes, default in Lazy Racket[14] | Dynamic by default, gradual with Typed Racket[15] | Yes[16] | Yes, with Algebraic Racket[17] | Partial[18] | No | Yes[19] |
Clojure | No[20] | Yes[21] | Dynamic[22] | Yes[23] | Yes[24] | Yes[25] | No | Yes[26] |
Standard ML | No[27] | No[28][29] | Static[30] | ? | ? | Yes[31] | ? | Yes |
Lazy ML | Yes[32] | Default[32] | Static[33] | ? | ? | Yes[31] | ? | Yes |
OCaml | No[34] | Yes[34] | Static[35] | Yes[36] | Yes[37] | Yes[38] | Partial, simulated with parametric modules[39] | Yes[34] |
F# | No[40] | Yes[41] | Static[42] | Yes[43] | Yes[44] | Yes[45] | No | Yes[46] |
Haskell | Yes[47] | Default[48] | Static[49] | Yes[47] | Yes[50] | Yes[51] | Yes[52] | Yes[53] |
Frege | Yes[54] | Default[54] | Static[54] | Yes[54] | Yes[54] | Yes[54] | Yes[54] | Yes[54] |
Scala | No[55] | Yes[56] | Static[55] | Yes[57] | Yes[57] | Yes[58] | Yes[59] | Yes[57] |
JavaScript | No[60][unreliable source?] | Partial, with extension[61] | Dynamic[62] | Partial, with extension[63] | Partial, with extension[64] | Partial[65][66] | No | Yes[67] |
Clean | Yes[68] | Yes, with optional strictness annotations[69] | Static with uniqueness/optionally dynamic[70] | Yes[69] | Yes[69] | Yes, except for unique types[69] | Yes[69] | Yes[69] |
Miranda | Yes[71] | Default[72] | Static[71] | Yes[73] | Yes[71] | ? | ? | ? |
SASL | Yes[74] | ? | Dynamic[75] | ? | ? | ? | ? | ? |
Elixir | No | Partial, with the Stream module[76] | Dynamic | Yes | No | Yes | No | Yes |
Erlang | No | No[77] | Dynamic | Yes[78] | No | Yes[79] | No | Yes |
Elm | Yes | No | Static[80] | ? | Yes[81] | Yes[80] | No | Yes[82] |
Python | No[83] | Partial, simulated with generators | Dynamic[84] | Yes[85] | No | Partial[86] | No | Yes[87] |
Candle | Yes[88] | ? | Dynamic[89] | Partial, only Sequence and Map[90] | ? | Partial[91] | ? | ? |
Idris | Yes[92] | Yes[92] | Static[92] | Yes[92] | Yes[92] | Yes[92] | Yes[92] | Yes[92] |
Kotlin | No | Partial, lazy delegation[93] and Sequence[94] | Static | Yes | No | Yes | No | Yes |
Julia | No | No[95] | Dynamic[96] | Yes[96] | No | Partial[96] | No | Yes |
PureScript | Yes | No | Static | Yes | Yes | Yes | Yes | Yes |
References
- ^ "LISP Introduction". Retrieved 26 November 2013.
- ^ Antoniotti, Marco. "CLAZY: Lazy Calling in Common Lisp". Retrieved 26 November 2013.
- ^ Tratt, Laurence (July 2009). "Dynamically Typed Languages". Advances in Computers. 77: 149–184. doi:10.1016/s0065-2458(09)01205-4. Retrieved 26 November 2013.
- ^ "LISP Tutorial Lecture 3: Data Abstraction".
- ^ "Algebraic data types in Common Lisp". Retrieved 11 May 2020.
- ^ "Mutable Data Structures" (PDF). Retrieved 28 November 2013.
- ^ "Closures in Lisp". Archived from the original on 12 October 2014. Retrieved 6 December 2013.
- ^ a b "Similar Functional Languages". Retrieved 26 November 2013.
- ^ "(Scheme) 17. Lazy Evaluation". Retrieved 30 April 2020.
- ^ "Records - Revised6 Report on the Algorithmic Language Scheme". Retrieved 11 May 2020.
- ^ "Algebraic Data Types in Scheme". Retrieved 11 May 2020.
- ^ "Programs with State". Retrieved 29 November 2013.
- ^ "Procedures as Closures in Scheme".
- ^ Barzilay, Eli. "Lazy Racket". Retrieved 8 February 2020.
- ^ Tobin-Hochstadt, Sam; St-Amour, Vincent; Dobson, Eric; Takikawa, Asumu. "Typed Racket". Retrieved 8 February 2020.
- ^ "The Racket Guide: Programmer-Defined Datatypes". Retrieved 8 February 2020.
- ^ Griffis, Eric. "Algebraic Racket". Retrieved 8 February 2020.
- ^ Buttrick, Matthew. "Beautiful Racket: Data Structures". Retrieved 8 February 2020.
- ^ "The Racket Reference: Procedures". Retrieved 8 February 2020.
- ^ "Clojure Functional Programing".
- ^ "Clojure - lazy". Retrieved 27 November 2013.
- ^ "Exploring clojure: dynamic typing". Retrieved 26 November 2013.
- ^ Engelberg, Mark. "Thoughts On Programming". Retrieved 26 November 2013.
- ^ "clojure-contrib, typing example". Retrieved 26 November 2013.
- ^ "clojure: functional programming overview". Retrieved 26 November 2013.
- ^ "Clojure - Higher Order Functions".
- ^ "Introduction to Functional Programming" (PDF). Retrieved 26 November 2013.
- ^ "Lazy and Eager Evaluation" (PDF). Retrieved 26 November 2013.
- ^ Harper, MacQueen, Milner. "Standard ML" (PDF). Section 3.6.
{{cite web}}
: CS1 maint: multiple names: authors list (link) - ^ Wikibooks:Standard ML Programming/Types
- ^ a b "Mutable and optional data". Retrieved 28 November 2013.
- ^ a b "The Interactive Lazy ML System". Retrieved 15 December 2013.
- ^ "A Compiler for Lazy ML". Retrieved 15 December 2013.
- ^ a b c "Functional Programming – OCaml". Retrieved 26 November 2013.
- ^ Hickey, Jason. "Introduction to Objective Caml" (PDF). Section 2.4. Cambridge University Press. Archived from the original (PDF) on 2 October 2013. Retrieved 26 November 2013.
- ^ "Type and exception definitions".
- ^ "Learn OCaml - Data Types".
- ^ "Learn OCaml - Imperative Features".
- ^ "Implementing Type-Classes as OCaml Modules". Retrieved 11 May 2020.
- ^ "Learning F#". Retrieved 6 December 2013.
- ^ "Lazy Computations (F#)". Microsoft Developer Network. Retrieved 26 November 2013.
- ^ "About F#". Retrieved 26 November 2013.
- ^ "Structures - F#". Retrieved 11 May 2020.
- ^ "Discriminated Unions".
- ^ "The F# 3.0 Language Specification: 1.1.2 Making Data Simple" (PDF). Retrieved 26 November 2013.
- ^ "F# Closure reference".
- ^ a b "Haskell Wiki". Retrieved 26 November 2013.
- ^ "Haskell Wiki Lazy Evaluation". Retrieved 26 November 2013.
- ^ "Haskell Typing". HaskellWiki. Retrieved 26 November 2013.
- ^ "Haskell Wiki Abstract Data Type". Retrieved 26 November 2013.
- ^ "Haskell Wiki". Retrieved 27 November 2013.
- ^ "Type Classes and Overloading".
- ^ "Haskell Wiki Closure". Retrieved 26 November 2013.
- ^ a b c d e f g h "Frege Language Reference" (PDF). Retrieved 26 February 2014.
- ^ a b "Scala Overview" (PDF). Retrieved 26 November 2013.
- ^ "Scala by Example" (PDF). Retrieved 26 November 2013.
- ^ a b c "Scala Reference" (PDF). Retrieved 26 November 2013.
- ^ "Mutable and Immutable Collections". Retrieved 26 November 2013.
- ^ "The Neophyte's Guide to Scala Part 12: Type Classes". Retrieved 29 November 2013.
- ^ List of multi-paradigm programming languages#Language overview
- ^ Tao, Dan. "Lazy.js". Dan Tao. Retrieved 26 November 2013.
- ^ "JavaScript Overview". Mozilla Developer Network. Mozilla Developer Network. Retrieved 26 November 2013.
- ^ Frank, Thomas. "Add some klass to JavaScript". thomasfrank.com. Archived from the original on 8 December 2013. Retrieved 26 November 2013.
- ^ Faubion, Nathan. "ADT". NPM. Joyent, nodejitsu. Retrieved 26 November 2013.
- ^ Immutable object#JavaScript
- ^ "Javascript Data structures". Mozilla Developer Network. Mozilla Developer Network. Retrieved 26 November 2013.
- ^ "Javascript Closures". Retrieved 26 November 2013.
- ^ "FAQ - Clean".
- ^ a b c d e f Plasmeijer, Rinus; Van Eekelen, Marko; Van Groningen, John (December 2011). Clean Version 2.2 Language Report (PDF). Department of Software Technology, University of Nijmegen. Retrieved 23 May 2018.
- ^ "Clean".
- ^ a b c "Miranda Official Website".
- ^ "An Overview of Miranda".
- ^ "An Overview of Miranda".
- ^ Turner, D.A. "An Implementation of SASL". University of St. Andrews, Department of Computer Science Technical Report. TR/75/4.
- ^ Kahn, Gilles; Bertot, Yves; Huet, Gérard; Lévy, Jean-Jacques; Plotkin, Gordon (2009-09-24). Kahn networks at the dawn of functional programming. ISBN 9780521518253.
- ^ "Stream - Elixir v.1.6.0".
- ^ "Erlang Reference Manual". Retrieved 27 November 2013.
- ^ "Erlang Programming Language - Abstract Patterns".
- ^ "Stack Overflow - How do I modify a record in erlang?". Retrieved 15 December 2013.
- ^ a b "Elm Blog - Interactive Programming". Archived from the original on 6 October 2013. Retrieved 29 November 2013.
- ^ "Elm Syntax - Algebraic Data Types". Archived from the original on 13 March 2016. Retrieved 29 November 2013.
- ^ "Closures and Currying - Programming with Elm".
- ^ "Functional Programming in Python".
- ^ "What is Python?".
- ^ "Abstract Data Types and Stacks" (PDF).
- ^ Immutable object#Python
- ^ "PEP 3104 -- Access to Names in Outer Spaces".
- ^ "Candle Overview". Retrieved 30 November 2013.
- ^ "Candle Overview".
- ^ "Candle Date Model Reference". Retrieved 30 November 2013.
- ^ "Candle's Procedural Design". Retrieved 30 November 2013.
- ^ a b c d e f g h "Idris Overview". Retrieved 6 December 2013.
- ^ "Kotlin - Delegated Properties".
- ^ "kotlin-stdlib - kotlin.sequences".
- ^ "Noteworthy Differences from Other Languages - The Julia Language".
- ^ a b c "Types - The Julia Language".