That is funny, Ada/SPARK is not mentioned at all! How strange.
https://en.wikibooks.org/wiki/Ada_Programming/Contract_Based...
http://www.ada-auth.org/standards/12rat/html/Rat12-2-3.html
https://docs.adacore.com/spark2014-docs/html/ug/en/source/ho...
https://blog.adacore.com/contracts-of-functions-in-spark-201...
Plus, I do not believe that static typing is pointless. Even if it were ONLY for documentation, that would already make it pretty useful, in my opinion, like Erlang's type specifications, although there is a static analysis tool called dialyzer that identifies software discrepancies such as type errors and such.
In any case, from AdaCore's website:
> In statically typed languages, a type is mainly (but not only) a compile time construct. It is a construct to enforce invariants about the behavior of a program. Invariants are unchangeable properties that hold for all variables of a given type. Enforcing them ensures, for example, that variables of a data type never have invalid values.
> A type is used to reason about the objects a program manipulates (an object is a variable or a constant). The aim is to classify objects by what you can accomplish with them (i.e., the operations that are permitted), and this way you can reason about the correctness of the objects' values.
Just for the curious:
> A nice feature of Ada is that you can define your own integer types, based on the requirements of your program (i.e., the range of values that makes sense). In fact, the definitional mechanism that Ada provides forms the semantic basis for the predefined integer types. There is no "magical" built-in type in that regard, which is unlike most languages, and arguably very elegant.