Haskell is a

purely
  • has referential transparency - expressions are like LEGO blocks
  • an expression evaluates to the same result regardless of context
  • the same input produces the same output
functional
  • functions are first-class objects - can be used as values and passed as arguments
  • programs are declarative - they describe the logic of the computation and not the control flow
  • the output value of a function depends only on arguments that are passed to the function
polymorphic
  • code can be written without mentioning specific types and use methods for groups of types e.g. all values of typeclass Num can use addition
statically typed
  • the type of a variable is known at compile time - using either specific type declarations or type inference (type is decided by the compiler)
lazy
  • it only evaluates expressions when it really has to

programming language