Comparison of functional programming languages: Difference between revisions

From HandWiki
imported>MedAI
add
 
fixing
 
Line 7: Line 7:
! Name !! [[Purely functional programming|Pure]] !! [[Lazy evaluation]] !! [[Type system|Typing]] !! [[Abstract data type]]s !! [[Algebraic data type]]s !! [[Immutable object|Data is immutable]] !! [[Type class]]es !! Garbage collection || First appeared
! Name !! [[Purely functional programming|Pure]] !! [[Lazy evaluation]] !! [[Type system|Typing]] !! [[Abstract data type]]s !! [[Algebraic data type]]s !! [[Immutable object|Data is immutable]] !! [[Type class]]es !! Garbage collection || First appeared
|-
|-
| [[Common Lisp]] || {{No}}<ref name=math-cs.gordon.edu>{{cite web|title=LISP Introduction|url=http://www.math-cs.gordon.edu/courses/cps323/LISP/lisp.html|access-date=26 November 2013}}</ref> || {{Partial}}, simulated with [[Thunk|thunk]]s<ref name=common-lisp>{{cite web|last=Antoniotti|first=Marco|title=CLAZY: Lazy Calling in Common Lisp|url=http://common-lisp.net/project/clazy/|access-date=26 November 2013}}</ref> || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite journal|last=Tratt|first=Laurence|title=Dynamically Typed Languages|journal=Advances in Computers|date=July 2009|volume=77|pages=149–184|url=http://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/|access-date=26 November 2013|doi=10.1016/s0065-2458(09)01205-4}}</ref>|| {{Yes}}<ref name=cs.sfu.ca>{{cite web|title=LISP Tutorial Lecture 3: Data Abstraction|url=http://www.cs.sfu.ca/CourseCentral/310/pwfong/Lisp/3/tutorial3.html}}</ref> || {{Partial}}, with extension<ref>{{cite web|title=Algebraic data types in Common Lisp|website=[[GitHub]] |url=https://github.com/stylewarning/cl-algebraic-data-type|access-date=11 May 2020}}</ref> || {{No}}<ref>{{cite web|title=Mutable Data Structures|url=http://caml.inria.fr/pub/docs/fpcl/fpcl-07.pdf|access-date=28 November 2013}}</ref> || {{Dunno|Not applicable}} || {{Yes}} || 1984
| [[Common Lisp]] || {{No}}<ref name=math-cs.gordon.edu>{{cite web|title=LISP Introduction|url=http://www.math-cs.gordon.edu/courses/cps323/LISP/lisp.html|access-date=26 November 2013}}</ref> || {{Partial|Simulated with [[Thunk|thunk]]s<ref name=common-lisp>{{cite web|last=Antoniotti|first=Marco|title=CLAZY: Lazy Calling in Common Lisp|url=http://common-lisp.net/project/clazy/|access-date=26 November 2013}}</ref>}} || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite journal|last=Tratt|first=Laurence|title=Dynamically Typed Languages|journal=Advances in Computers|date=July 2009|volume=77|pages=149–184|url=http://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/|access-date=26 November 2013|doi=10.1016/s0065-2458(09)01205-4|url-access=subscription}}</ref>|| {{Yes}}<ref name=cs.sfu.ca>{{cite web|title=LISP Tutorial Lecture 3: Data Abstraction|url=http://www.cs.sfu.ca/CourseCentral/310/pwfong/Lisp/3/tutorial3.html}}</ref> || {{Partial|Extension}}<ref>{{cite web|title=Algebraic data types in Common Lisp|website=[[GitHub]] |url=https://github.com/stylewarning/cl-algebraic-data-type|access-date=11 May 2020}}</ref> || {{No}}<ref>{{cite web|title=Mutable Data Structures|url=http://caml.inria.fr/pub/docs/fpcl/fpcl-07.pdf|access-date=28 November 2013}}</ref> || {{Dunno}} || {{Yes}} || 1984
|-
|-
| [[Scheme (programming language)|Scheme]] || {{No}}<ref name=caml.inria.fr>{{cite web|title=Similar Functional Languages|url=http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora202.html|access-date=26 November 2013}}</ref> || {{Yes}}<ref>{{cite web|title=(Scheme) 17. Lazy Evaluation|url=http://www.shido.info/lisp/scheme_lazy_e.html|access-date=30 April 2020}}</ref> || style="background:#FC6; text-align:center"|Dynamic<ref name="caml.inria.fr" /> || {{Yes}}<ref>{{cite web|title=Records - Revised<sup>6</sup> Report on the Algorithmic Language Scheme|url=http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib.html|access-date=11 May 2020}}</ref> || {{Partial}}, simulated with thunks<ref>{{cite web|title=Algebraic Data Types in Scheme|url=https://pavpanchekha.com/blog/adtscm.html|access-date=11 May 2020}}</ref> || {{No}}<ref>{{cite web|title=Programs with State|url=http://www.cs.uni.edu/~wallingf/teaching/cs3540/sessions/session26.html|access-date=29 November 2013}}</ref>|| {{Dunno|Not applicable}} || {{Yes}} || 1975
| [[Scheme (programming language)|Scheme]] || {{No}}<ref name=caml.inria.fr>{{cite web|title=Similar Functional Languages|url=http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora202.html|access-date=26 November 2013}}</ref> || {{Yes}}<ref>{{cite web|title=(Scheme) 17. Lazy Evaluation|url=http://www.shido.info/lisp/scheme_lazy_e.html|access-date=30 April 2020}}</ref> || style="background:#FC6; text-align:center"|Dynamic<ref name="caml.inria.fr" /> || {{Yes}}<ref>{{cite web|title=Records - Revised<sup>6</sup> Report on the Algorithmic Language Scheme|url=http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib.html|access-date=11 May 2020}}</ref> || {{Partial|Simulated with thunks}}<ref>{{cite web|title=Algebraic Data Types in Scheme|url=https://pavpanchekha.com/blog/adtscm.html|access-date=11 May 2020}}</ref> || {{No}}<ref>{{cite web|title=Programs with State|url=http://www.cs.uni.edu/~wallingf/teaching/cs3540/sessions/session26.html|access-date=29 November 2013}}</ref>|| {{No}} || {{Yes}} || 1975
|-
|-
| [[Racket (programming language)|Racket]] || {{No}} || {{Yes}}, default in Lazy Racket<ref name="lazy racket">{{cite web|url=https://docs.racket-lang.org/lazy/index.html|title=Lazy Racket|access-date=8 February 2020|first=Eli|last=Barzilay}}</ref> || style="background:#99F; text-align:center"|Dynamic by default, [[Gradual typing|gradual]] with Typed Racket<ref name="typed racket">{{cite web|url=https://docs.racket-lang.org/ts-reference/index.html|title=Typed Racket|access-date=8 February 2020|first1=Sam|last1=Tobin-Hochstadt|first2=Vincent|last2=St-Amour|first3=Eric|last3=Dobson|first4=Asumu|last4=Takikawa}}</ref> || {{Yes}}<ref name="racket struct">{{cite web|url=https://docs.racket-lang.org/guide/define-struct.html|title=The Racket Guide: Programmer-Defined Datatypes|access-date=8 February 2020}}</ref> || {{Yes2}}Yes, with Algebraic Racket<ref name="algebraic racket">{{Cite web|url=https://docs.racket-lang.org/algebraic/index.html|title=Algebraic Racket|access-date=8 February 2020|first=Eric|last=Griffis}}</ref> || {{partial}}<ref name="racket immutability">{{Cite web|url=https://beautifulracket.com/explainer/data-structures.html|title=Beautiful Racket: Data Structures|access-date=8 February 2020|first=Matthew|last=Buttrick}}</ref> || {{No}} || {{Yes}} || 1995
| [[Racket (programming language)|Racket]] || {{No}} || {{Yes2}}Default in Lazy Racket<ref name="lazy racket">{{cite web|url=https://docs.racket-lang.org/lazy/index.html|title=Lazy Racket|access-date=8 February 2020|first=Eli|last=Barzilay}}</ref> || style="background:#99F; text-align:center"|[[Strong and weak typing|Strong]], Dynamic, statically typed with [[Gradual typing|gradual typing]] in Typed Racket<ref name="typed racket">{{cite web|url=https://docs.racket-lang.org/ts-reference/index.html|title=Typed Racket|access-date=8 February 2020|first1=Sam|last1=Tobin-Hochstadt|first2=Vincent|last2=St-Amour|first3=Eric|last3=Dobson|first4=Asumu|last4=Takikawa}}</ref> || {{Yes}}<ref name="racket struct">{{cite web|url=https://docs.racket-lang.org/guide/define-struct.html|title=The Racket Guide: Programmer-Defined Datatypes|access-date=8 February 2020}}</ref> || {{Yes2}}Yes, with Algebraic Racket<ref name="algebraic racket">{{Cite web|url=https://docs.racket-lang.org/algebraic/index.html|title=Algebraic Racket|access-date=8 February 2020|first=Eric|last=Griffis}}</ref> || {{Partial}}<ref name="racket immutability">{{Cite web|url=https://beautifulracket.com/explainer/data-structures.html|title=Beautiful Racket: Data Structures|access-date=8 February 2020|first=Matthew|last=Buttrick}}</ref> || {{No}} || {{Yes}} || 1995
|-
|-
| [[Clojure]] || {{No}}<ref>{{cite web|title=Clojure Functional Programing|url=http://clojure.org/functional_programming}}</ref>  || {{Yes}}<ref>{{cite web|title=Clojure - lazy|url=http://clojure.org/lazy|access-date=27 November 2013}}</ref> || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite web|title=Exploring clojure: dynamic typing|date=7 December 2012 |url=http://tgoossens.wordpress.com/2012/12/07/dynamically-exploring-clojure/|access-date=26 November 2013}}</ref>  || {{Yes}}<ref>{{cite web|last=Engelberg|first=Mark|title=Thoughts On Programming|date=21 April 2009 |url=http://programming-puzzler.blogspot.com/2009/04/adts-in-clojure.html|access-date=26 November 2013}}</ref>  || {{Yes}}<ref name="clojure-contrib">{{cite web|title=clojure-contrib, typing example|url=https://code.google.com/p/clojure-contrib/source/browse/trunk/src/clojure/contrib/types/examples.clj?spec=svn596&r=596|access-date=26 November 2013}}</ref> || {{Yes}}<ref name=clojure.org>{{cite web|title=clojure: functional programming overview|url=http://clojure.org/functional_programming|access-date=26 November 2013}}</ref> || {{Dunno|Not applicable}} || {{Yes}} || 2007
| [[Clojure]] || {{No}}<ref>{{cite web|title=Clojure Functional Programing|url=http://clojure.org/functional_programming}}</ref>  || {{Yes}}<ref>{{cite web|title=Clojure - lazy|url=http://clojure.org/lazy|access-date=27 November 2013}}</ref> || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite web|title=Exploring clojure: dynamic typing|date=7 December 2012 |url=http://tgoossens.wordpress.com/2012/12/07/dynamically-exploring-clojure/|access-date=26 November 2013}}</ref>  || {{Yes}}<ref>{{cite web|last=Engelberg|first=Mark|title=Thoughts On Programming|date=21 April 2009 |url=http://programming-puzzler.blogspot.com/2009/04/adts-in-clojure.html|access-date=26 November 2013}}</ref>  || {{Yes}}<ref name="clojure-contrib">{{cite web|title=clojure-contrib, typing example|url=https://code.google.com/p/clojure-contrib/source/browse/trunk/src/clojure/contrib/types/examples.clj?spec=svn596&r=596|access-date=26 November 2013}}</ref> || {{Yes}}<ref name=clojure.org>{{cite web|title=clojure: functional programming overview|url=http://clojure.org/functional_programming|access-date=26 November 2013}}</ref> || {{No}} || {{Yes}} || 2007
|-
|-
| [[Standard ML]] || {{No}}<ref name=cl.cam.ac.uk>{{cite web|title=Introduction to Functional Programming|url=http://www.cl.cam.ac.uk/~jrh13/slides/funprog-jrh/l8.pdf|access-date=26 November 2013}}</ref> || {{No}}<ref>{{cite web|title=Lazy and Eager Evaluation|url=http://homepages.inf.ed.ac.uk/dts/fps/lecture-notes/lazy.pdf|access-date=26 November 2013}}</ref><ref>{{cite web|last=Harper, MacQueen, Milner|title=Standard ML|url=http://www.lfcs.inf.ed.ac.uk/reports/86/ECS-LFCS-86-2/ECS-LFCS-86-2.pdf|work=Section 3.6}}</ref> || style="background:#8CF; text-align:center"|Static<ref>Wikibooks:Standard ML Programming/Types</ref>  || {{Yes}} || {{Yes}}|| {{Yes}}<ref name="courses">{{cite web|title=Mutable and optional data|url=http://courses.cs.washington.edu/courses/cse341/04wi/lectures/08-ml-refs.html|access-date=28 November 2013}}</ref> || {{No}} || {{Yes}} || 1983
| [[Standard ML]] || {{No}}<ref name=cl.cam.ac.uk>{{cite web|title=Introduction to Functional Programming|url=http://www.cl.cam.ac.uk/~jrh13/slides/funprog-jrh/l8.pdf|access-date=26 November 2013}}</ref> || {{No}}<ref>{{cite web|title=Lazy and Eager Evaluation|url=http://homepages.inf.ed.ac.uk/dts/fps/lecture-notes/lazy.pdf|access-date=26 November 2013}}</ref><ref>{{cite web|last=Harper, MacQueen, Milner|title=Standard ML|url=http://www.lfcs.inf.ed.ac.uk/reports/86/ECS-LFCS-86-2/ECS-LFCS-86-2.pdf|work=Section 3.6}}</ref> || style="background:#8CF; text-align:center"|Static<ref>Wikibooks:Standard ML Programming/Types</ref>  || {{Yes}} || {{Yes}}|| {{Yes}}<ref name="courses">{{cite web|title=Mutable and optional data|url=http://courses.cs.washington.edu/courses/cse341/04wi/lectures/08-ml-refs.html|access-date=28 November 2013}}</ref> || {{No}} || {{Yes}} || 1983
|-
|-
| [[OCaml]] || {{No}}<ref name=ocaml-functional>{{cite web|title=Functional Programming – OCaml|url=http://ocaml.org/learn/tutorials/functional_programming.html|access-date=26 November 2013}}</ref> || {{Yes}}<ref name=ocaml-functional /> || style="background:#8CF; text-align:center"|Static<ref>{{cite web|last=Hickey|first=Jason|title=Introduction to Objective Caml|url=http://files.metaprl.org/doc/ocaml-book.pdf|work=Section 2.4|publisher=Cambridge University Press|access-date=26 November 2013|url-status=dead|archive-url=https://web.archive.org/web/20131002091023/http://files.metaprl.org/doc/ocaml-book.pdf|archive-date=2 October 2013}}</ref> || {{Yes}}<ref>{{cite web|title=Type and exception definitions|url=http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual016.html}}</ref> || {{Yes}}<ref>{{cite web|url=http://ocaml.org/learn/description.html#DataTypes| title=Learn OCaml - Data Types}}</ref> || {{Yes}}<ref>{{cite web|url=http://ocaml.org/learn/description.html#Imperativefeatures | title=Learn OCaml - Imperative Features}}</ref> || {{Partial}}, simulated with parametric modules<ref>{{cite web|title=Implementing Type-Classes as OCaml Modules|url=https://accu.org/index.php/journals/2445|access-date=11 May 2020}}</ref> || {{Yes}}  || 1996
| [[OCaml]] || {{No}}<ref name=ocaml-functional>{{cite web|title=Functional Programming – OCaml|url=http://ocaml.org/learn/tutorials/functional_programming.html|access-date=26 November 2013}}</ref> || {{Yes}}<ref name=ocaml-functional /> || style="background:#8CF; text-align:center"|Static<ref>{{cite web|last=Hickey|first=Jason|title=Introduction to Objective Caml|url=http://files.metaprl.org/doc/ocaml-book.pdf|work=Section 2.4|publisher=Cambridge University Press|access-date=26 November 2013|url-status=dead|archive-url=https://web.archive.org/web/20131002091023/http://files.metaprl.org/doc/ocaml-book.pdf|archive-date=2 October 2013}}</ref> || {{Yes}}<ref>{{cite web|title=Type and exception definitions|url=http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual016.html}}</ref> || {{Yes}}<ref>{{cite web|url=http://ocaml.org/learn/description.html#DataTypes| title=Learn OCaml - Data Types}}</ref> || {{Yes}}<ref>{{cite web|url=http://ocaml.org/learn/description.html#Imperativefeatures | title=Learn OCaml - Imperative Features}}</ref> || {{Partial|Simulated with parametric modules}}<ref>{{cite web|title=Implementing Type-Classes as OCaml Modules|url=https://accu.org/index.php/journals/2445|access-date=11 May 2020}}</ref> || {{Yes}}  || 1996
|-
|-
| [[F Sharp (programming language)|F#]] || {{No}}<ref>{{cite web | url=http://fsharpforfunandprofit.com/learning-fsharp/| access-date=6 December 2013 | title=Learning F#}}</ref>|| {{Yes}}<ref name="msdn">{{cite web|title=Lazy Computations (F#)|url=http://msdn.microsoft.com/en-us/library/vstudio/dd233247.aspx|publisher=Microsoft Developer Network|access-date=26 November 2013}}</ref>  || style="background:#8CF; text-align:center"|Static<ref>{{cite web|title=About F#|url=http://fsharp.org/about/index.html|access-date=26 November 2013}}</ref>  || {{Yes}}<ref>{{cite web|title=Structures - F#|url=https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/structures|access-date=11 May 2020}}</ref> || {{Yes}}<ref>{{cite web|title=Discriminated Unions|url=https://msdn.microsoft.com/en-us/library/dd233226.aspx}}</ref> || {{Yes}}<ref name=f-sharp-lang-spec>{{cite web|title=The F# 3.0 Language Specification: 1.1.2 Making Data Simple|url=http://fsharp.org/about/files/spec.pdf|access-date=26 November 2013}}</ref> || {{No}} || {{Yes}} || 2005
| [[F Sharp (programming language)|F#]] || {{No}}<ref>{{cite web | url=http://fsharpforfunandprofit.com/learning-fsharp/| access-date=6 December 2013 | title=Learning F#}}</ref>|| {{Yes}}<ref name="msdn">{{cite web|title=Lazy Computations (F#)|url=http://msdn.microsoft.com/en-us/library/vstudio/dd233247.aspx|publisher=Microsoft Developer Network|access-date=26 November 2013}}</ref>  || style="background:#8CF; text-align:center"|Static<ref>{{cite web|title=About F#|url=http://fsharp.org/about/index.html|access-date=26 November 2013}}</ref>  || {{Yes}}<ref>{{cite web|title=Structures - F#|url=https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/structures|access-date=11 May 2020}}</ref> || {{Yes}}<ref>{{cite web|title=Discriminated Unions|date=15 September 2021 |url=https://msdn.microsoft.com/en-us/library/dd233226.aspx}}</ref> || {{Yes}}<ref name=f-sharp-lang-spec>{{cite web|title=The F# 3.0 Language Specification: 1.1.2 Making Data Simple|url=http://fsharp.org/about/files/spec.pdf|access-date=26 November 2013}}</ref> || {{No}} || {{Yes}} || 2005
|-
|-
| [[Haskell]] || {{Yes}}<ref name=haskell.org>{{cite web|title=Haskell Wiki|url=http://www.haskell.org|access-date=26 November 2013}}</ref> || {{Yes2}}Default<ref name=haskell.org.wiki.lazyEval>{{cite web|title=Haskell Wiki Lazy Evaluation|url=http://www.haskell.org/haskellwiki/Lazy_evaluation|access-date=26 November 2013}}</ref> || style="background:#8CF; text-align:center"|Static<ref name="haskell.org.wiki.typing">{{cite web|title=Haskell Typing|url=http://www.haskell.org/haskellwiki/Typing|publisher=HaskellWiki|access-date=26 November 2013}}</ref> || {{Yes}}<ref name="haskell.org" /> || {{Yes}}<ref name=haskell.org.wiki.abstractDataType>{{cite web|title=Haskell Wiki Abstract Data Type|url=http://www.haskell.org/haskellwiki/Abstract_data_type|access-date=26 November 2013}}</ref> || {{Yes}}<ref>{{cite web|url=http://www.haskell.org/haskellwiki/Functional_programming#Immutable_data|title=Haskell Wiki|access-date=27 November 2013}}</ref> || {{Yes}}<ref>{{cite web|url=http://www.haskell.org/tutorial/classes.html|title=Type Classes and Overloading}}</ref> || {{Yes}} || 1990
| [[Haskell]] || {{Yes}}<ref name=haskell.org>{{cite web|title=Haskell Wiki|url=http://www.haskell.org|access-date=26 November 2013}}</ref> || {{Yes2}}Default<ref name=haskell.org.wiki.lazyEval>{{cite web|title=Haskell Wiki Lazy Evaluation|url=http://www.haskell.org/haskellwiki/Lazy_evaluation|access-date=26 November 2013}}</ref> || style="background:#8CF; text-align:center"|Static<ref name="haskell.org.wiki.typing">{{cite web|title=Haskell Typing|url=http://www.haskell.org/haskellwiki/Typing|publisher=HaskellWiki|access-date=26 November 2013}}</ref> || {{Yes}}<ref name="haskell.org" /> || {{Yes}}<ref name=haskell.org.wiki.abstractDataType>{{cite web|title=Haskell Wiki Abstract Data Type|url=http://www.haskell.org/haskellwiki/Abstract_data_type|access-date=26 November 2013}}</ref> || {{Yes}}<ref>{{cite web|url=http://www.haskell.org/haskellwiki/Functional_programming#Immutable_data|title=Haskell Wiki|access-date=27 November 2013}}</ref> || {{Yes}}<ref>{{cite web|url=http://www.haskell.org/tutorial/classes.html|title=Type Classes and Overloading}}</ref> || {{Yes}} || 1990
Line 25: Line 25:
| [[Scala (programming language)|Scala]] || {{No}}<ref name=scala-lang.org.archives.files.ScalaOverview>{{cite web|title=Scala Overview|url=http://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/ScalaOverview.pdf|access-date=26 November 2013}}</ref> || {{Yes}}<ref name=scala-lang.org.files.ScalaExample>{{cite web|title=Scala by Example|url=http://www.scala-lang.org/docu/files/ScalaByExample.pdf|access-date=26 November 2013}}</ref> || style="background:#8CF; text-align:center"|Static<ref name="scala-lang.org.archives.files.ScalaOverview" /> || {{Yes}}<ref name="scala-lang.org/files/archive">{{cite web|title=Scala Reference|url=http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf|access-date=26 November 2013}}</ref> || {{Yes}}<ref name="scala-lang.org/files/archive" /> || {{Yes}}<ref name=scala-lang.org.collections.overview>{{cite web|title=Mutable and Immutable Collections|url=http://docs.scala-lang.org/overviews/collections/overview.html|access-date=26 November 2013}}</ref> || {{Yes}}<ref>{{cite web|title=The Neophyte's Guide to Scala Part 12: Type Classes|url=http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html|access-date=29 November 2013}}</ref> || {{Yes}} || 2004
| [[Scala (programming language)|Scala]] || {{No}}<ref name=scala-lang.org.archives.files.ScalaOverview>{{cite web|title=Scala Overview|url=http://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/ScalaOverview.pdf|access-date=26 November 2013}}</ref> || {{Yes}}<ref name=scala-lang.org.files.ScalaExample>{{cite web|title=Scala by Example|url=http://www.scala-lang.org/docu/files/ScalaByExample.pdf|access-date=26 November 2013}}</ref> || style="background:#8CF; text-align:center"|Static<ref name="scala-lang.org.archives.files.ScalaOverview" /> || {{Yes}}<ref name="scala-lang.org/files/archive">{{cite web|title=Scala Reference|url=http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf|access-date=26 November 2013}}</ref> || {{Yes}}<ref name="scala-lang.org/files/archive" /> || {{Yes}}<ref name=scala-lang.org.collections.overview>{{cite web|title=Mutable and Immutable Collections|url=http://docs.scala-lang.org/overviews/collections/overview.html|access-date=26 November 2013}}</ref> || {{Yes}}<ref>{{cite web|title=The Neophyte's Guide to Scala Part 12: Type Classes|url=http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html|access-date=29 November 2013}}</ref> || {{Yes}} || 2004
|-
|-
| [[JavaScript]] || {{No}}<ref>List of multi-paradigm programming languages#Language overview</ref>{{unreliable source?|date=March 2015}}  || {{Partial}}, with extension<ref>{{cite web|last=Tao|first=Dan|title=Lazy.js|url=http://danieltao.com/lazy.js/|work=Dan Tao|access-date=26 November 2013}}</ref>  || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite web|title=JavaScript Overview|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/JavaScript_Overview|work=Mozilla Developer Network|publisher=Mozilla Developer Network|access-date=26 November 2013}}</ref>  || {{Partial}}, with extension<ref>{{cite web|last=Frank|first=Thomas|title=Add some klass to JavaScript|url=http://www.thomasfrank.se/klass.html|work=thomasfrank.com|access-date=26 November 2013|archive-url=https://web.archive.org/web/20131208100043/http://thomasfrank.se/klass.html|archive-date=8 December 2013|url-status=dead}}</ref>  || {{Partial}}, with extension<ref>{{cite web|last=Faubion|first=Nathan|title=ADT|url=https://npmjs.org/package/adt|work=NPM|publisher=Joyent, nodejitsu|access-date=26 November 2013}}</ref>  || {{partial}}<ref>[[Immutable object]]</ref><ref>{{cite web|title=Javascript Data structures|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures|work=Mozilla Developer Network|publisher=Mozilla Developer Network|access-date=26 November 2013}}</ref> || {{Dunno|Not applicable}} || {{Yes}} || 1995
| [[JavaScript]] || {{No}} || {{Partial|Extension}}<ref>{{cite web|last=Tao|first=Dan|title=Lazy.js|url=http://danieltao.com/lazy.js/|work=Dan Tao|access-date=26 November 2013}}</ref>  || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite web|title=JavaScript Overview|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/JavaScript_Overview|work=Mozilla Developer Network|access-date=26 November 2013}}</ref>  || {{Partial|Extension}}<ref>{{cite web|last=Frank|first=Thomas|title=Add some klass to JavaScript|url=http://www.thomasfrank.se/klass.html|work=thomasfrank.com|access-date=26 November 2013|archive-url=https://web.archive.org/web/20131208100043/http://thomasfrank.se/klass.html|archive-date=8 December 2013|url-status=dead}}</ref>  || {{Partial|Extension}}<ref>{{cite web|last=Faubion|first=Nathan|title=ADT|url=https://npmjs.org/package/adt|work=NPM|publisher=Joyent, nodejitsu|access-date=26 November 2013}}</ref>  || {{Partial}}<ref>[[Immutable object]]</ref><ref>{{cite web|title=Javascript Data structures|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures|work=Mozilla Developer Network|access-date=26 November 2013}}</ref> || {{Dunno}} || {{Yes}} || 1995
|-
|-
| [[Clean (programming language)|Clean]] || {{Yes}}<ref name="clean-faq">{{cite web | url=http://clean.cs.ru.nl/FAQ | title=FAQ - Clean}}</ref> || {{Yes}}, with optional strictness annotations<ref name="clean-report">{{cite book|last1=Plasmeijer|first1=Rinus|last2=Van Eekelen|first2=Marko|last3=Van Groningen|first3=John|title=Clean Version 2.2 Language Report|date=December 2011|publisher=Department of Software Technology, University of Nijmegen|url=http://clean.cs.ru.nl/download/doc/CleanLangRep.2.2.pdf|access-date=23 May 2018}}</ref> || style="background:#99F; text-align:center"|Static with [[Uniqueness type|uniqueness]]/optionally dynamic<ref name="clean-wiki">{{cite web | url=http://clean.cs.ru.nl/Clean | title=Clean}}</ref> || {{Yes}}<ref name="clean-report"/> || {{Yes}}<ref name="clean-report"/> || {{Yes}}, except for unique types<ref name="clean-report"/> || {{Yes}}<ref name="clean-report"/> || {{Yes}} || 1987
| [[Clean (programming language)|Clean]] || {{Yes}}<ref name="clean-faq">{{cite web | url=http://clean.cs.ru.nl/FAQ | title=FAQ - Clean}}</ref> || {{Yes}}, with optional strictness annotations<ref name="clean-report">{{cite book|last1=Plasmeijer|first1=Rinus|last2=Van Eekelen|first2=Marko|last3=Van Groningen|first3=John|title=Clean Version 2.2 Language Report|date=December 2011|publisher=Department of Software Technology, University of Nijmegen|url=http://clean.cs.ru.nl/download/doc/CleanLangRep.2.2.pdf|access-date=23 May 2018}}</ref> || style="background:#99F; text-align:center"|Static with [[Uniqueness type|uniqueness]]/optionally dynamic<ref name="clean-wiki">{{cite web | url=http://clean.cs.ru.nl/Clean | title=Clean}}</ref> || {{Yes}}<ref name="clean-report"/> || {{Yes}}<ref name="clean-report"/> || {{Yes}}, except for unique types<ref name="clean-report"/> || {{Yes}}<ref name="clean-report"/> || {{Yes}} || 1987
Line 31: Line 31:
| [[Miranda (programming language)|Miranda]] || {{Yes}}<ref name=miranda.org.uk>{{cite web | url=http://miranda.org.uk/ | title=Miranda Official Website}}</ref> || {{Yes2}}Default<ref name="http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Lazy">{{cite web | url=http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Lazy | title=An Overview of Miranda}}</ref> || style="background:#8CF; text-align:center"|Static<ref name=miranda.org.uk/> || {{Yes}}<ref name="http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Abstract">{{cite web | url=http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Abstract | title=An Overview of Miranda}}</ref> || {{Yes}}<ref name="miranda.org.uk" /> || {{Yes}} || {{No}} || {{Yes}} || 1986
| [[Miranda (programming language)|Miranda]] || {{Yes}}<ref name=miranda.org.uk>{{cite web | url=http://miranda.org.uk/ | title=Miranda Official Website}}</ref> || {{Yes2}}Default<ref name="http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Lazy">{{cite web | url=http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Lazy | title=An Overview of Miranda}}</ref> || style="background:#8CF; text-align:center"|Static<ref name=miranda.org.uk/> || {{Yes}}<ref name="http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Abstract">{{cite web | url=http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Abstract | title=An Overview of Miranda}}</ref> || {{Yes}}<ref name="miranda.org.uk" /> || {{Yes}} || {{No}} || {{Yes}} || 1986
|-
|-
| [[SASL (programming language)|SASL]] || {{Yes}}<ref>Turner, D.A. "An Implementation of SASL". University of St. Andrews, Department of Computer Science Technical Report. TR/75/4.</ref> || {{Yes}} || style="background:#FC6; text-align:center"|Dynamic<ref name="From Semantics to Computer Science">{{cite book | url=https://books.google.com/books?id=W2baKp7710sC&q=sasl+dynamic+typing&pg=PA128 | title=Kahn networks at the dawn of functional programming| isbn=9780521518253| last1=Kahn| first1=Gilles| last2=Bertot| first2=Yves| last3=Huet| first3=Gérard| last4=Lévy| first4=Jean-Jacques| last5=Plotkin| first5=Gordon| date=2009-09-24}}</ref> || {{Yes}} || {{Yes}} || {{Yes}} || {{No}} || {{Yes}} || 1972
| [[SASL (programming language)|SASL]] || {{Yes}}<ref>Turner, D.A. "An Implementation of SASL". University of St. Andrews, Department of Computer Science Technical Report. TR/75/4.</ref> || {{Yes}} || style="background:#FC6; text-align:center"|Dynamic<ref name="From Semantics to Computer Science">{{cite book | url=https://books.google.com/books?id=W2baKp7710sC&q=sasl+dynamic+typing&pg=PA128 | title=Kahn networks at the dawn of functional programming| isbn=9780521518253| last1=Kahn| first1=Gilles| last2=Bertot| first2=Yves| last3=Huet| first3=Gérard| last4=Lévy| first4=Jean-Jacques| last5=Plotkin| first5=Gordon| date=2009-09-24| publisher=Cambridge University Press}}</ref> || {{Yes}} || {{Yes}} || {{Yes}} || {{No}} || {{Yes}} || 1972
|-
|-
| [[Elixir (programming language)|Elixir]] || {{No}} || {{Partial}}, with the Stream module<ref name="https://hexdocs.pm/elixir/Stream.html">{{cite web | url=https://hexdocs.pm/elixir/Stream.html | title=Stream - Elixir v.1.6.0}}</ref> || style="background:#FC6; text-align:center"|Dynamic || {{Yes}} || {{No}} || {{Yes}} || {{Dunno|Not applicable}} || {{Yes}} || 2012
| [[Elixir (programming language)|Elixir]] || {{No}} || {{Partial|Stream module<ref name="https://hexdocs.pm/elixir/Stream.html">{{cite web | url=https://hexdocs.pm/elixir/Stream.html| title=Stream Elixir v1.17.2}} </ref>}} || style="background:#FC6; text-align:center"|Dynamic || {{Yes}} || {{No}} || {{Yes}} || {{Dunno}} || {{Yes}} || 2012
|-
|-
| [[Erlang (programming language)|Erlang]] || {{No}} || {{No}}<ref name=erlang.org>{{cite web | url=http://www.erlang.org/doc/reference_manual/expressions.html#id76539| access-date=27 November 2013 | title=Erlang Reference Manual}}</ref> || style="background:#FC6; text-align:center"|Dynamic || {{Yes}}<ref>{{cite web | url=http://www.erlang.org/eeps/eep-0029.html | title=Erlang Programming Language - Abstract Patterns}}</ref> || {{No}} || {{Yes}}<ref name=stackoverflow.com>{{cite web | url=https://stackoverflow.com/questions/2715517/how-do-i-modify-a-record-in-erlang | access-date=15 December 2013 | title=Stack Overflow - How do I modify a record in erlang?}}</ref> || {{Dunno|Not applicable}} || {{Yes}} || 1986
| [[Erlang (programming language)|Erlang]] || {{No}} || {{No}}<ref name=erlang.org>{{cite web | url=http://www.erlang.org/doc/reference_manual/expressions.html#id76539| access-date=27 November 2013 | title=Erlang Reference Manual}}</ref> || style="background:#FC6; text-align:center"|Dynamic || {{Yes}}<ref>{{cite web | url=http://www.erlang.org/eeps/eep-0029.html | title=Erlang Programming Language - Abstract Patterns}}</ref> || {{No}} || {{Yes}}<ref name=stackoverflow.com>{{cite web | url=https://stackoverflow.com/questions/2715517/how-do-i-modify-a-record-in-erlang | access-date=15 December 2013 | title=Stack Overflow - How do I modify a record in erlang?}}</ref> || {{Dunno}} || {{Yes}} || 1986
|-
|-
| [[Elm (programming language)|Elm]] || {{Yes}} || {{No}} || style="background:#8CF; text-align:center"|Static<ref name=elm-lang.org.blog.interactiveProgramming>{{cite web | url=http://elm-lang.org/blog/Interactive-Programming.elm | access-date=29 November 2013 | title=Elm Blog - Interactive Programming | archive-url=https://web.archive.org/web/20131006235603/http://elm-lang.org/blog/Interactive-Programming.elm | archive-date=6 October 2013 | url-status=dead }}</ref> || {{dunno}} || {{Yes}}<ref name=elm-lang.org.learn.syntax>{{cite web | url=http://elm-lang.org/learn/Syntax.elm#algebraic-data-types | access-date=29 November 2013 | title=Elm Syntax - Algebraic Data Types | archive-url=https://web.archive.org/web/20160313052210/http://elm-lang.org/learn/syntax.elm#algebraic-data-types | archive-date=13 March 2016 | url-status=dead }}</ref> || {{Yes}}<ref name=elm-lang.org.blog.interactiveProgramming /> || {{No}} || {{Yes}} || 2012
| [[Elm (programming language)|Elm]] || {{Yes}} || {{No}} || style="background:#8CF; text-align:center"|Static<ref name=elm-lang.org.blog.interactiveProgramming>{{cite web | url=http://elm-lang.org/blog/Interactive-Programming.elm | access-date=29 November 2013 | title=Elm Blog - Interactive Programming | archive-url=https://web.archive.org/web/20131006235603/http://elm-lang.org/blog/Interactive-Programming.elm | archive-date=6 October 2013 | url-status=dead }}</ref> || {{dunno}} || {{Yes}}<ref name=elm-lang.org.learn.syntax>{{cite web | url=http://elm-lang.org/learn/Syntax.elm#algebraic-data-types | access-date=29 November 2013 | title=Elm Syntax - Algebraic Data Types | archive-url=https://web.archive.org/web/20160313052210/http://elm-lang.org/learn/syntax.elm#algebraic-data-types | archive-date=13 March 2016 | url-status=dead }}</ref> || {{Yes}}<ref name=elm-lang.org.blog.interactiveProgramming /> || {{No}} || {{Yes}} || 2012
Line 41: Line 41:
| [[Futhark (programming language)|Futhark]] || {{Yes}} || {{No}} || style="background:#8CF; text-align:center"|Static<ref name=futhark-lang.org.docs.inference>{{cite web | url=https://futhark.readthedocs.io/en/latest/language-reference.html#type-inference | access-date=24 July 2023 | title=Type Inference}}</ref> || {{Yes}} || {{Yes}} || {{Yes}}<ref name=elm-lang.org.blog.interactiveProgramming /> || {{No}} || {{Yes}} || 2014
| [[Futhark (programming language)|Futhark]] || {{Yes}} || {{No}} || style="background:#8CF; text-align:center"|Static<ref name=futhark-lang.org.docs.inference>{{cite web | url=https://futhark.readthedocs.io/en/latest/language-reference.html#type-inference | access-date=24 July 2023 | title=Type Inference}}</ref> || {{Yes}} || {{Yes}} || {{Yes}}<ref name=elm-lang.org.blog.interactiveProgramming /> || {{No}} || {{Yes}} || 2014
|-
|-
| [[Python (programming language)|Python]] || {{No}}<ref>{{cite web | url=https://docs.python.org/3/howto/functional.html | title=Functional Programming in Python}}</ref> || {{Partial}}, simulated with generators || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite web | url=https://docs.python.org/3/faq/general.html#what-is-python | title=What is Python?}}</ref> || {{Yes}}<ref>{{cite web | url=http://www.cs.utexas.edu/~byoung/cs313e/slides5-adt.pdf | title=Abstract Data Types and Stacks}}</ref> || {{No}} || {{partial}}<ref>[[Immutable object]]</ref> || {{Dunno|Not applicable}} || {{Yes}} || 1991
| [[Python (programming language)|Python]] || {{No}}<ref>{{cite web | url=https://docs.python.org/3/howto/functional.html | title=Functional Programming in Python}}</ref> || {{Partial|Simulated with generators}} || style="background:#FC6; text-align:center"|Dynamic<ref>{{cite web | url=https://docs.python.org/3/faq/general.html#what-is-python | title=What is Python?}}</ref> || {{Yes}}<ref>{{cite web | url=http://www.cs.utexas.edu/~byoung/cs313e/slides5-adt.pdf | title=Abstract Data Types and Stacks}}</ref> || {{No}} || {{Partial}}<ref>[[Immutable object]]</ref> || {{Dunno}} || {{Yes}} || 1991
|-
|-
| [[Idris (programming language)|Idris]] || {{Yes}}<ref name=idris-lang.org>{{cite web|title=Idris Overview|url=http://www.idris-lang.org/|access-date=6 December 2013}}</ref> || {{Yes}}<ref name="idris-lang.org" /> || style="background:#8CF; text-align:center"|Static<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}} || 2007
| [[Idris (programming language)|Idris]] || {{Yes}}<ref name=idris-lang.org>{{cite web|title=Idris Overview|url=http://www.idris-lang.org/|access-date=6 December 2013}}</ref> || {{Yes}}<ref name="idris-lang.org" /> || style="background:#8CF; text-align:center"|Static<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}}<ref name="idris-lang.org" /> || {{Yes}} || 2007
|-
|-
| [[Software:Nix (package manager)|Nix]] || {{Yes}} || {{No}} || style="background:#8CF; text-align:center"|Static || {{No}} || {{Yes}} || {{Yes}} || {{No}} || {{Yes}} || 2003
| [[Software:Nix (package manager)|Nix]] || {{Yes}}<ref name="nix language">{{cite web|title=Nix Language - Nix 2.34.0 Reference Manual|url=https://nix.dev/manual/nix/2.34/language/}}</ref> || {{Yes}}<ref name="nix language" /> || style="background:#FC6; text-align:center"|Dynamic<ref name="nix language" /> || {{No}} || {{Yes}} || {{Yes}} || {{No}} || {{Yes}} || 2003
|-
|-
|[[Wolfram Language]]
|[[Wolfram Language]]
Line 58: Line 58:
| 1988
| 1988
|-
|-
|[[Kotlin (programming language)|Kotlin]]
|[[Software:Kotlin|Kotlin]]
|{{No}}
|{{No}}
|{{Partial}}, lazy delegation<ref>{{cite web | url=https://kotlinlang.org/docs/reference/delegated-properties.html | title=Kotlin - Delegated Properties}}</ref> and Sequence<ref>{{cite web | url=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/ | title=kotlin-stdlib - kotlin.sequences}}</ref>
|{{Partial|Lazy delegation<ref>{{cite web |url=https://kotlinlang.org/docs/reference/delegated-properties.html |title=Kotlin - Delegated Properties}}</ref> and Sequence<ref>{{cite web |url=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/ |title=kotlin-stdlib - kotlin.sequences}}</ref>}}
|style="background:#8CF; text-align:center"|Static
|style="background:#8CF; text-align:center"|Static
|{{Yes}}
|{{Yes}}
Line 77: Line 77:
|{{Yes}}
|{{Yes}}
|{{No}}
|{{No}}
|{{maybe|Swift uses [[Automatic Reference Counting]], which differs from [[Tracing garbage collection|tracing garbage collection]] but is designed to provide similar benefits with better performance.}}
|{{Partial|Swift uses [[Automatic Reference Counting]], which differs from [[Tracing garbage collection|tracing garbage collection]] but is designed to provide similar benefits with better performance.}}
| 2014
| 2014
|-
|-
Line 87: Line 87:
|{{No}}
|{{No}}
|{{Partial}}<ref name=julia-typing/>
|{{Partial}}<ref name=julia-typing/>
|{{Dunno|Not applicable}}
|{{Dunno}}
|{{Yes}}
|{{Yes}}
| 2012
| 2012
Line 104: Line 104:
|[[Rust (programming language)|Rust]]
|[[Rust (programming language)|Rust]]
|{{No}}
|{{No}}
|{{Partial}}, iterators are lazy,<ref>{{cite web | url=https://doc.rust-lang.org/book/ch13-02-iterators.html | title=The Rust Programming Language, Processing a Series of Items with Iterators }}</ref> external libraries exist<ref>{{cite web | url=https://crates.io/crates/lazy | title=Rust crate 'lazy'}} </ref>
|{{Partial|Lazy iterators}}<ref>{{cite web | url=https://doc.rust-lang.org/book/ch13-02-iterators.html | title=The Rust Programming Language, Processing a Series of Items with Iterators }}</ref> and external libraries<ref>{{cite web | url=https://crates.io/crates/lazy | title=Rust crate 'lazy'}}</ref>
|style="background:#8CF; text-align:center"|Static<ref>{{cite web |url=https://doc.rust-lang.org/book/ch03-02-data-types.html | title=The Rust Programming Language, Data Types}}</ref>
|style="background:#8CF; text-align:center"|Static<ref>{{cite web |url=https://doc.rust-lang.org/book/ch03-02-data-types.html | title=The Rust Programming Language, Data Types}}</ref>
|{{Yes}}<ref name="rust-traits">{{cite web | url=https://doc.rust-lang.org/book/ch10-02-traits.html | title=The Rust Programming Language, Traits}}</ref>
|{{Yes}}<ref name="rust-traits">{{cite web | url=https://doc.rust-lang.org/book/ch10-02-traits.html | title=The Rust Programming Language, Traits}}</ref>
Line 120: Line 120:
|{{Yes}}
|{{Yes}}
|{{Yes}}
|{{Yes}}
|{{Unknown}}
|{{Dunno}}
|{{Yes}}
|{{Yes}}
|2019
|2019
|-
|-
| [[D (programming language)|D]]  
| [[D (programming language)|D]]  
| {{No}}<ref>{{cite web|title=D - A general-purpose systems and applications programming language|url=https://dlang.org/|access-date=6 December 2013}}</ref>
| {{Partial|Optional}}<ref>{{cite web|title=D pure functions|url=https://dlang.org/spec/function.html#pure-functions|access-date=3 February 2024}}</ref><ref>{{cite web|title=D safe functions|url=https://dlang.org/spec/function.html#safe-functions|access-date=3 February 2024}}</ref>
| {{Yes}}, but not default<ref>{{cite web|title=Laziness - Dlang Tour|url=https://tour.dlang.org/tour/en/basics/laziness|access-date=7 April 2020}}</ref>
| {{Partial|Optional}}<ref>{{cite web|title=Laziness - Dlang Tour|url=https://tour.dlang.org/tour/en/basics/laziness|access-date=7 April 2020}}</ref>
| style="background:#8CF; text-align:center"|Static<ref>{{cite web|title=Type System|url=https://dlang.org/spec/type.html|access-date=7 April 2020}}</ref>
| style="background:#8CF; text-align:center"|Static<ref>{{cite web|title=Type System|url=https://dlang.org/spec/type.html|access-date=7 April 2020}}</ref>
| {{dunno}}
| {{dunno}}
Line 134: Line 134:
| {{Yes}}<ref>{{cite web|title=Garbage Collection|url=https://dlang.org/spec/garbage.html|access-date=7 April 2020}}</ref>
| {{Yes}}<ref>{{cite web|title=Garbage Collection|url=https://dlang.org/spec/garbage.html|access-date=7 April 2020}}</ref>
| 2001
| 2001
 
|-
| Gleam || {{No}}<ref name = Gleam>{{cite web | url=https://gleam.run/frequently-asked-questions/#will-gleam-have-type-classes | title=Frequently asked questions – Gleam }}</ref> || {{Partial|Experimental external libraries}} || style="background:#8CF; text-align:center"|Static || {{Yes}} || {{Yes}} || {{Yes}} || {{No}} || {{Yes}} || 2019
|}
|}


Line 140: Line 141:
{{reflist|3}}
{{reflist|3}}


{{Programming paradigms navbox}}
[[Category:Functional languages| ]]
[[Category:Functional languages| ]]
[[Category:Programming language comparisons|Functional programming languages]]


{{Sourceattribution|Comparison of functional programming languages}}
{{Sourceattribution|Comparison of functional programming languages}}

Latest revision as of 01:48, 24 May 2026

Short description: none


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 Extension[51] Dynamic[52] Extension[53] Extension[54] Partial[55][56] ? Yes 1995
Clean Yes[57] Yes, with optional strictness annotations[58] Static with uniqueness/optionally dynamic[59] Yes[58] Yes[58] Yes, except for unique types[58] Yes[58] Yes 1987
Miranda Yes[60] Default[61] Static[60] Yes[62] Yes[60] Yes No Yes 1986
SASL Yes[63] Yes Dynamic[64] Yes Yes Yes No Yes 1972
Elixir No Stream module[65] Dynamic Yes No Yes ? Yes 2012
Erlang No No[66] Dynamic Yes[67] No Yes[68] ? Yes 1986
Elm Yes No Static[69] ? Yes[70] Yes[69] No Yes 2012
Futhark Yes No Static[71] Yes Yes Yes[69] No Yes 2014
Python No[72] Simulated with generators Dynamic[73] Yes[74] No Partial[75] ? Yes 1991
Idris Yes[76] Yes[76] Static[76] Yes[76] Yes[76] Yes[76] Yes[76] Yes 2007
Nix Yes[77] Yes[77] Dynamic[77] 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

References

  1. "LISP Introduction". http://www.math-cs.gordon.edu/courses/cps323/LISP/lisp.html. 
  2. Antoniotti, Marco. "CLAZY: Lazy Calling in Common Lisp". http://common-lisp.net/project/clazy/. 
  3. Tratt, Laurence (July 2009). "Dynamically Typed Languages". Advances in Computers 77: 149–184. doi:10.1016/s0065-2458(09)01205-4. http://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/. Retrieved 26 November 2013. 
  4. "LISP Tutorial Lecture 3: Data Abstraction". http://www.cs.sfu.ca/CourseCentral/310/pwfong/Lisp/3/tutorial3.html. 
  5. "Algebraic data types in Common Lisp". https://github.com/stylewarning/cl-algebraic-data-type. 
  6. "Mutable Data Structures". http://caml.inria.fr/pub/docs/fpcl/fpcl-07.pdf. 
  7. 7.0 7.1 "Similar Functional Languages". http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora202.html. 
  8. "(Scheme) 17. Lazy Evaluation". http://www.shido.info/lisp/scheme_lazy_e.html. 
  9. "Records - Revised6 Report on the Algorithmic Language Scheme". http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib.html. 
  10. "Algebraic Data Types in Scheme". https://pavpanchekha.com/blog/adtscm.html. 
  11. "Programs with State". http://www.cs.uni.edu/~wallingf/teaching/cs3540/sessions/session26.html. 
  12. Barzilay, Eli. "Lazy Racket". https://docs.racket-lang.org/lazy/index.html. 
  13. Tobin-Hochstadt, Sam; St-Amour, Vincent; Dobson, Eric; Takikawa, Asumu. "Typed Racket". https://docs.racket-lang.org/ts-reference/index.html. 
  14. "The Racket Guide: Programmer-Defined Datatypes". https://docs.racket-lang.org/guide/define-struct.html. 
  15. Griffis, Eric. "Algebraic Racket". https://docs.racket-lang.org/algebraic/index.html. 
  16. Buttrick, Matthew. "Beautiful Racket: Data Structures". https://beautifulracket.com/explainer/data-structures.html. 
  17. "Clojure Functional Programing". http://clojure.org/functional_programming. 
  18. "Clojure - lazy". http://clojure.org/lazy. 
  19. "Exploring clojure: dynamic typing". 7 December 2012. http://tgoossens.wordpress.com/2012/12/07/dynamically-exploring-clojure/. 
  20. Engelberg, Mark (21 April 2009). "Thoughts On Programming". http://programming-puzzler.blogspot.com/2009/04/adts-in-clojure.html. 
  21. "clojure-contrib, typing example". https://code.google.com/p/clojure-contrib/source/browse/trunk/src/clojure/contrib/types/examples.clj?spec=svn596&r=596. 
  22. "clojure: functional programming overview". http://clojure.org/functional_programming. 
  23. "Introduction to Functional Programming". http://www.cl.cam.ac.uk/~jrh13/slides/funprog-jrh/l8.pdf. 
  24. "Lazy and Eager Evaluation". http://homepages.inf.ed.ac.uk/dts/fps/lecture-notes/lazy.pdf. 
  25. Harper, MacQueen, Milner. "Standard ML". Section 3.6. http://www.lfcs.inf.ed.ac.uk/reports/86/ECS-LFCS-86-2/ECS-LFCS-86-2.pdf. 
  26. Wikibooks:Standard ML Programming/Types
  27. "Mutable and optional data". http://courses.cs.washington.edu/courses/cse341/04wi/lectures/08-ml-refs.html. 
  28. 28.0 28.1 "Functional Programming – OCaml". http://ocaml.org/learn/tutorials/functional_programming.html. 
  29. Hickey, Jason. "Introduction to Objective Caml". Section 2.4. Cambridge University Press. http://files.metaprl.org/doc/ocaml-book.pdf. 
  30. "Type and exception definitions". http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual016.html. 
  31. "Learn OCaml - Data Types". http://ocaml.org/learn/description.html#DataTypes. 
  32. "Learn OCaml - Imperative Features". http://ocaml.org/learn/description.html#Imperativefeatures. 
  33. "Implementing Type-Classes as OCaml Modules". https://accu.org/index.php/journals/2445. 
  34. "Learning F#". http://fsharpforfunandprofit.com/learning-fsharp/. 
  35. "Lazy Computations (F#)". Microsoft Developer Network. http://msdn.microsoft.com/en-us/library/vstudio/dd233247.aspx. 
  36. "About F#". http://fsharp.org/about/index.html. 
  37. "Structures - F#". https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/structures. 
  38. "Discriminated Unions". 15 September 2021. https://msdn.microsoft.com/en-us/library/dd233226.aspx. 
  39. "The F# 3.0 Language Specification: 1.1.2 Making Data Simple". http://fsharp.org/about/files/spec.pdf. 
  40. 40.0 40.1 "Haskell Wiki". http://www.haskell.org. 
  41. "Haskell Wiki Lazy Evaluation". http://www.haskell.org/haskellwiki/Lazy_evaluation. 
  42. "Haskell Typing". HaskellWiki. http://www.haskell.org/haskellwiki/Typing. 
  43. "Haskell Wiki Abstract Data Type". http://www.haskell.org/haskellwiki/Abstract_data_type. 
  44. "Haskell Wiki". http://www.haskell.org/haskellwiki/Functional_programming#Immutable_data. 
  45. "Type Classes and Overloading". http://www.haskell.org/tutorial/classes.html. 
  46. 46.0 46.1 "Scala Overview". http://www.scala-lang.org/old/sites/default/files/linuxsoft_archives/docu/files/ScalaOverview.pdf. 
  47. "Scala by Example". http://www.scala-lang.org/docu/files/ScalaByExample.pdf. 
  48. 48.0 48.1 "Scala Reference". http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf. 
  49. "Mutable and Immutable Collections". http://docs.scala-lang.org/overviews/collections/overview.html. 
  50. "The Neophyte's Guide to Scala Part 12: Type Classes". http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html. 
  51. Tao, Dan. "Lazy.js". Dan Tao. http://danieltao.com/lazy.js/. 
  52. "JavaScript Overview". Mozilla Developer Network. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/JavaScript_Overview. 
  53. Frank, Thomas. "Add some klass to JavaScript". thomasfrank.com. http://www.thomasfrank.se/klass.html. 
  54. Faubion, Nathan. "ADT". NPM. Joyent, nodejitsu. https://npmjs.org/package/adt. 
  55. Immutable object
  56. "Javascript Data structures". Mozilla Developer Network. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures. 
  57. "FAQ - Clean". http://clean.cs.ru.nl/FAQ. 
  58. 58.0 58.1 58.2 58.3 58.4 Plasmeijer, Rinus; Van Eekelen, Marko; Van Groningen, John (December 2011). Clean Version 2.2 Language Report. Department of Software Technology, University of Nijmegen. http://clean.cs.ru.nl/download/doc/CleanLangRep.2.2.pdf. Retrieved 23 May 2018. 
  59. "Clean". http://clean.cs.ru.nl/Clean. 
  60. 60.0 60.1 60.2 "Miranda Official Website". http://miranda.org.uk/. 
  61. "An Overview of Miranda". http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Lazy. 
  62. "An Overview of Miranda". http://www.cs.kent.ac.uk/people/staff/dat/miranda/Overview.html#Abstract. 
  63. Turner, D.A. "An Implementation of SASL". University of St. Andrews, Department of Computer Science Technical Report. TR/75/4.
  64. Kahn, Gilles; Bertot, Yves; Huet, Gérard; Lévy, Jean-Jacques; Plotkin, Gordon (2009-09-24). Kahn networks at the dawn of functional programming. Cambridge University Press. ISBN 9780521518253. https://books.google.com/books?id=W2baKp7710sC&q=sasl+dynamic+typing&pg=PA128. 
  65. "Stream — Elixir v1.17.2". https://hexdocs.pm/elixir/Stream.html. 
  66. "Erlang Reference Manual". http://www.erlang.org/doc/reference_manual/expressions.html#id76539. 
  67. "Erlang Programming Language - Abstract Patterns". http://www.erlang.org/eeps/eep-0029.html. 
  68. "Stack Overflow - How do I modify a record in erlang?". https://stackoverflow.com/questions/2715517/how-do-i-modify-a-record-in-erlang. 
  69. 69.0 69.1 69.2 "Elm Blog - Interactive Programming". http://elm-lang.org/blog/Interactive-Programming.elm. 
  70. "Elm Syntax - Algebraic Data Types". http://elm-lang.org/learn/Syntax.elm#algebraic-data-types. 
  71. "Type Inference". https://futhark.readthedocs.io/en/latest/language-reference.html#type-inference. 
  72. "Functional Programming in Python". https://docs.python.org/3/howto/functional.html. 
  73. "What is Python?". https://docs.python.org/3/faq/general.html#what-is-python. 
  74. "Abstract Data Types and Stacks". http://www.cs.utexas.edu/~byoung/cs313e/slides5-adt.pdf. 
  75. Immutable object
  76. 76.0 76.1 76.2 76.3 76.4 76.5 76.6 "Idris Overview". http://www.idris-lang.org/. 
  77. 77.0 77.1 77.2 "Nix Language - Nix 2.34.0 Reference Manual". https://nix.dev/manual/nix/2.34/language/. 
  78. "Kotlin - Delegated Properties". https://kotlinlang.org/docs/reference/delegated-properties.html. 
  79. "kotlin-stdlib - kotlin.sequences". https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/. 
  80. "Noteworthy Differences from Other Languages - The Julia Language". https://docs.julialang.org/en/v1/manual/noteworthy-differences/. 
  81. 81.0 81.1 81.2 "Types - The Julia Language". https://docs.julialang.org/en/v1/manual/types/. 
  82. "The Rust Programming Language, Processing a Series of Items with Iterators". https://doc.rust-lang.org/book/ch13-02-iterators.html. 
  83. "Rust crate 'lazy'". https://crates.io/crates/lazy. 
  84. "The Rust Programming Language, Data Types". https://doc.rust-lang.org/book/ch03-02-data-types.html. 
  85. 85.0 85.1 "The Rust Programming Language, Traits". https://doc.rust-lang.org/book/ch10-02-traits.html. 
  86. "The Rust Programming Language, Enums". https://doc.rust-lang.org/book/ch06-00-enums.html. 
  87. "The Rust Programming Language, Variables and Mutability". https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html. 
  88. "D pure functions". https://dlang.org/spec/function.html#pure-functions. 
  89. "D safe functions". https://dlang.org/spec/function.html#safe-functions. 
  90. "Laziness - Dlang Tour". https://tour.dlang.org/tour/en/basics/laziness. 
  91. "Type System". https://dlang.org/spec/type.html. 
  92. "Immutable - Dlang Tour". https://tour.dlang.org/tour/en/basics/immutability. 
  93. "Garbage Collection". https://dlang.org/spec/garbage.html. 
  94. "Frequently asked questions – Gleam". https://gleam.run/frequently-asked-questions/#will-gleam-have-type-classes. 

Template:Programming paradigms navbox