1. What is the purpose of Clean?
The purpose of Clean is to serve as a fast, non-strict, purely functional programming language that is easy to optimize. Clean is characterized by lazy evaluation, which means that only arguments that need to be evaluated in a function call are actually evaluated. In addition, Clean functions can be written to use (partially) strict evaluation when necessary. Unlike R6RS Scheme and similar to Haskell, Clean offers pattern-matching, guards, array comprehensions, and a Hindley-Milner style type inferencing scheme . Unlike Haskell, Clean offers list comprehensions. For I/O-related functions, in contrast to Haskell's monads, Clean offers a uniqueness type inferencing system, which allows destructive transformation of state information within a purely functional framework. Clean is useful for writing relatively bug-free programs in fewer lines of code, and for formally proving properties of those programs, thereby often eliminating the need for debugging.
2. What are the advantages of Clean?
Clean has the following advantages over similar functional programming languages:
- Efficient running-time of compiled code: Clean is one of the fastest functional programming languages. For many applications, Clean is appreciably faster than Haskell, and at least on par with OCaml. According to a Gentoo benchmark, the current Clean entry runs the meteor-contest benchmark 2.6 times faster than the corresponding Haskell GHC entry.
- Easy optimization of code: According to at least one user on Stay Hungry, Stay Foolish - Blog, Clean code can be easier to optimize than Haskell code. Also, according to one user on Nabble - Haskell - Haskell-Cafe - Why can't Haskell be faster?, "[T]he Clean type system gives more information to the compiler than the Haskell system does. The Haskell type system doesn't say that a certain value can be updated in-place or that a certain value should not be boxed (not counting the GHC extension for unboxed types)." (quote by Reinier). In addition, according to another user there, "[C]lean's uniqueness types allow for a certain kind of zero-copy mutation optimisation which is much harder for a haskell compiler to automatically infer." (quote by Jules).
- For discussions on how Clean optimizes its code vs. Haskell, see the following: