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 fo...