Programming in a statically typed functional language (think Haskell) gives quite a few safety guarantees as well as a lot of expressivity thanks to the use of higher-order functions. However the type system lets you write some problematic functions like: loop :: Int -> Int loop n = 1 + loop n Why is that problematic? For one, this function never terminates, that can't be good. But also, and this