case e of Just x -> f xevaluates e and matches it against Just x before f is called, while
let Just x = e in f xevaluates e and performs the match only if f actually uses x. A pattern can be forced to match lazily by applying the ~ operator to it, so
case e of ~Just x -> f xbehaves just like the let above. There is no way to force strict matching in a let. Pattern matching has had this meaning since the first version of Haskell.
let (x,y) = (1,x) in...non-terminating, because the rhs cannot be evaluated until after x and y are bound, which cannot happen until after the rhs is evaluated... However, a simple compile-time check can detect many such cases.
Changing the meaning of pattern matching would undoubtedly change the behaviour of many programs. Many functions would become a little stricter; some programs would stop working, while others would experience a change of evaluation order leading perhaps to space leaks that didn't exist before. There is no hard evidence that these problems would be severe, but neither is there evidence that they would be insignificant. Another group on the committee (overlapping with the first!) believes that it would be wrong to take the risk.
A smaller group believes that the present design is superior in principle to an `always strict' design. In a lazy language, nothing should be strict unless it must be. ~ is a subtle operator which the programmer should not need to understand. Making matching strict in lets will surprise the lazy programmer and lead to unexpected errors in programs.
However, the views with most support are the first two: that consistently strict matching is a better language design, but should not be adopted because of the pain it would cause existing users.