> pure (the opposite of imperative).
Pure is not quite the opposite of imperative; declarative is the opposite of imperative, although in practice it is true that pure functional languages tend to be more declarative that imperative functional ones.
You can have pure (AKA referentially transparent) imperative languages if they are synchronous[1]. The synchronous style is especially well suited to reactive/interactive applications, and quite popular in hard realtime applications.
Also, we don't really have exact definitions to any of these terms (imperative, pure, functional, declarative). Here is my attempt for approximate, problematic definitions:
* Functional -- a language that models most/all computations as (possibly partial) mathematical functions, and constructs a program by assembling those functions.
* Imperative -- a language that models computation as state transitions, specifying what state should the computation have at each step.
* Declarative -- a language that describes what result should the program give (as a function, a relation or a behavior) rather than at each step.
* Pure -- a language where the semantic value of the composition of syntactic terms can be determined by the semantic value of each of the component terms and no others.
[1]: https://en.wikipedia.org/wiki/Synchronous_programming_langua...