Static contract checking for Haskell