I&#x27;d distinguish between (at least) three degrees of “purity”:<p>(0) Absolutely anything goes. Examples: Racket (in the REPL), Lisp, Clojure, Scala, Erlang, etc.<p>(1) Values are immutable, but any computation might have any effect. Examples: Standard ML, OCaml (mostly), Racket (mostly).<p>(2) Values are immutable, and computations are type-annotated with their possible effects. Examples: Haskell, Idris, Ur&#x2F;Web.