What are the exact semantics of equality constraints? Are these two types exactly equivalent?
f :: Int -> IO [T] g :: (a ~ T) => Int -> IO [a]