Non-exhaustive patterns are one thing the compiler can't catch:
fn 0 = return ()
main = fn 1
Giving an empty list to head/tail is another: main = head []