If you would like GHC to check that every top-level value has a type signature, use the `-fsignatures-required' option.
If you would like to disallow "name shadowing," i.e., an inner-scope value has the same name as an outer-scope value, then use the `-fname-shadowing-not-ok' option. This option catches typographical errors that turn into hard-to-find bugs, e.g., in the inadvertent cyclic definition `let x = ... x ... in'.
Consequently, this option does not allow cyclic recursive definitions.
If you're feeling really paranoid, the `-dcore-lint' option is a good choice. It turns on heavyweight intra-pass sanity-checking within GHC. (It checks GHC's sanity, not yours.)