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 | Garbage collection | First appeared |
|---|---|---|---|---|---|---|---|---|---|
| Common Lisp | No [1] | Simulated with thunks [2] | Dynamic [3] | Yes [4] | Extension [5] | No [6] | ? | Yes | 1984 |
| Scheme | No [7] | Yes [8] | Dynamic [7] | Yes [9] | Simulated with thunks [10] | No [11] | No | Yes | 1975 |
| Racket | No | Default in Lazy Racket [12] | Strong, Dynamic, statically typed with gradual typing in Typed Racket [13] | Yes [14] | Yes, with Algebraic Racket [15] | Partial [16] | No | Yes | 1995 |
| Clojure | No [17] | Yes [18] | Dynamic [19] | Yes [20] | Yes [21] | Yes [22] | No | Yes | 2007 |
| Standard ML | No [23] | No [24] [25] | Static [26] | Yes | Yes | Yes [27] | No | Yes | 1983 |
| OCaml | No [28] | Yes [28] | Static [29] | Yes [30] | Yes [31] | Yes [32] | Simulated with parametric modules [33] | Yes | 1996 |
| F# | No [34] | Yes [35] | Static [36] | Yes [37] | Yes [38] | Yes [39] | No | Yes | 2005 |
| Haskell | Yes [40] | Default [41] | Static [42] | Yes [40] | Yes [43] | Yes [44] | Yes [45] | Yes | 1990 |
| Scala | No [46] | Yes [47] | Static [46] | Yes [48] | Yes [48] | Yes [49] | Yes [50] | Yes | 2004 |
| JavaScript | No [51] [ unreliable source? ] | Extension [52] | Dynamic [53] | Extension [54] | Extension [55] | Partial [56] [57] | ? | Yes | 1995 |
| Clean | Yes [58] | Yes, with optional strictness annotations [59] | Static with uniqueness/optionally dynamic [60] | Yes [59] | Yes [59] | Yes, except for unique types [59] | Yes [59] | Yes | 1987 |
| Miranda | Yes [61] | Default [62] | Static [61] | Yes [63] | Yes [61] | Yes | No | Yes | 1986 |
| SASL | Yes [64] | Yes | Dynamic [65] | Yes | Yes | Yes | No | Yes | 1972 |
| Elixir | No | Stream module [66] | Dynamic | Yes | No | Yes | ? | Yes | 2012 |
| Erlang | No | No [67] | Dynamic | Yes [68] | No | Yes [69] | ? | Yes | 1986 |
| Elm | Yes | No | Static [70] | ? | Yes [71] | Yes [70] | No | Yes | 2012 |
| Futhark | Yes | No | Static [72] | Yes | Yes | Yes [70] | No | Yes | 2014 |
| Python | No [73] | Simulated with generators | Dynamic [74] | Yes [75] | No | Partial [76] | ? | Yes | 1991 |
| Idris | Yes [77] | Yes [77] | Static [77] | Yes [77] | Yes [77] | Yes [77] | Yes [77] | Yes | 2007 |
| Nix | Yes | No | Static[ citation needed ] | No | Yes | Yes | No | Yes | 2003 |
| Wolfram Language | No | No | Static | Yes | Yes | Yes | No | Yes | 1988 |
| Kotlin | No | Lazy delegation [78] and Sequence [79] | Static | Yes | No | Yes | No | Yes | 2011 |
| Swift | No | No | Static | Yes | Yes | Yes | No | Swift uses Automatic Reference Counting, which differs from tracing garbage collection but is designed to provide similar benefits with better performance. | 2014 |
| Julia | No | No [80] | Dynamic [81] | Yes [81] | No | Partial [81] | ? | Yes | 2012 |
| PureScript | Yes | No | Static | Yes | Yes | Yes | Yes | Yes | 2013 |
| Rust | No | Lazy iterators [82] and external libraries [83] | Static [84] | Yes [85] | Yes [86] | Yes [87] | Yes, through traits [85] | No | 2010 |
| Bosque | No | No | Static | Yes | Yes | Yes | ? | Yes | 2019 |
| D | Optional [88] [89] | Optional [90] | Static [91] | ? | Yes | Yes [92] | No | Yes [93] | 2001 |
| Gleam | No [94] | Experimental external libraries | Static | Yes | Yes | Yes | No | Yes | 2019 |
{{cite web}}: CS1 maint: multiple names: authors list (link)