Robert Harper points out that dynamically typed languages are a subset of statically typed languages. To wit, we could handle J values in Haskell with something like:
Variable types (à la System F) are not templates, though one can think of them as type schemata. A template
An established problem in functional programming is the question of evaluation
order (see Hudak, §2.2).
Haskell offers seq; which allows the programmer to magically introduce
dependencies in evaluation order and thence subvert lazy evaluation.
Sometimes this is necessary; see the foldl foldl' example.
If we wish to preserve global uniqueness of names during \(\beta\)-reduction, we have to \(\alpha\)-rename before each substitution. Consider:
Haskell puts all side effects in the IO monad, which passes around the
RealWorld. This is unsatisfactory for a number of reasons, and Haskellers have spilled much ink on effects systems.
As I recently noted, there are
distinctions in how one handles effects at the logical level: in particular,
randomness is different from array writes.