The pattern (p1, p2) is strict in the outermost tuple constructor, which can lead to unexpected strictness behaviour. For example, the following expression diverges (using Data.Function.fix):
fix $ \(x, y) -> (1, 2)
since the match on (x, y) is strict in the tuple constructor. However, the following expression, using an irrefutable pattern, evaluates to (1, 2) as expected:
fix $ \ ~(x, y) -> (1, 2)