Prelude> :t 11111111111111111111111
11111111111111111111111 :: Num a => a
Prelude> :t (length [])
(length []) :: Int
Prelude> 11111111111111111111111111111 - (length [])
1729917383
Prelude> 1111111111111111111111111111 - 0
1111111111111111111111111111
Prelude> 1111111111111111111111111111 - fromIntegral (length [])
1111111111111111111111111111
Prelude> 11111111111111111111111111111 :: Int
1729917383
"Int" is the machine-length integer type. "Integer" is the unbounded, but slower integer type ("bigint" in other languages). In Prelude, "length" always returns an Int, assuming that the length of a list will never be bigger than 232.
Haskell interprets numeric literals as the typeclass (Num a => a), meaning any member of the typeclass Num can be constructed using these literals. Int is one such type, and causes wraparound when it constructs an instance using the typeclass.
Numeric literals are automatically treated as Num instances, so when you subtract (length []) which is an Int, the literal is treated as an Int. In this case, it triggers an overflow condition, something that programmers understand well and have been dealing with from the earliest days.
Haskell interprets numeric literals as the typeclass (Num a => a), meaning any member of the typeclass Num can be constructed using these literals. Int is one such type, and causes wraparound when it constructs an instance using the typeclass.