A strong type system can do more than prove memory safety. It can guarantee that their are no unhandled cases, and that data has been properly processed before going into a certain use; however it (generally) cannot guarantee correctness.
I say generally because the Haskell type system (with some extensions) is Turing complete, so you probably code implement a code prover in the type system.
I say generally because the Haskell type system (with some extensions) is Turing complete, so you probably code implement a code prover in the type system.