[Haskell-cafe] Where are rank-3 types necessary in practice for maintaining abstraction?