7.23.�Control over monomorphism

GHC supports two flags that control the way in which generalisation is carried out at let and where bindings.

7.23.1.�Switching off the dreaded Monomorphism Restriction

Haskell's monomorphism restriction (see Section 4.5.5 of the Haskell Report) can be completely switched off by -XNoMonomorphismRestriction.

7.23.2.�Monomorphic pattern bindings

As an experimental change, we are exploring the possibility of making pattern bindings monomorphic; that is, not generalised at all. A pattern binding is a binding whose LHS has no function arguments, and is not a simple variable. For example:

  f x = x                    -- Not a pattern binding
  f = \x -> x                -- Not a pattern binding
  f :: Int -> Int = \x -> x  -- Not a pattern binding

  (g,h) = e                  -- A pattern binding
  (f) = e                    -- A pattern binding
  [x] = e                    -- A pattern binding

Experimentally, GHC now makes pattern bindings monomorphic by default. Use -XNoMonoPatBinds to recover the standard behaviour.