aligned non-unifiable types in error messages
A simple example is:
f :: (a, (b, Bool)) -> Int
f _ = 9
g = f (0.0, (1, 2))
This gives:
(v2,(v1,Bool))
(Real,(Int,Int))
For this simple type it doesn't matter of course, but for more complex types alignment would help:
(v2, (v1, Bool))
(Real ,(Int, Int ))
By the way, GHC gives this error:
Couldn't match expected type ‘Bool’ with actual type ‘Int’
In the expression: 2 :: Int
In the expression: (1, 2 :: Int)
In the first argument of ‘f’, namely ‘(0.0, (1, 2 :: Int))’
Not sure if this is the way to go. I'd prefer coloring to indicate which sub-types match and which do not. Apart from this, alignment would be a good first step.