Expanding type synonyms in error messages proposal
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
There is a thread started by Ömer Sinan Ağacan in ghc-devs mailing list which suggests to add expansion of type-synonims in GHC's error-messages. Simon Peyton Jones suggested we should create a wiki-page for a collection of examples where you could see actual error-messages under discussion. This page is sort of that place. Feel free to add more examples.
Example: Pipes error
import Control.Applicative
import Pipes
import qualified Pipes.Prelude as P
import System.IO (isEOF)
duplicate :: Monad m => a -> Producer a m ()
duplicate x = yield x >> yield x
loop :: Producer String IO ()
loop = for P.stdinLn duplicate
doubleUp :: Monad m => Consumer String m String
doubleUp = (++) <$> await <*> await
main :: IO ()
main = do
runEffect $ loop >-> doubleUp
Current error message:
Couldn't match type ‘[Char]’ with ‘()’ Expected type: Proxy () String () X IO () Actual type: Consumer String IO String In the second argument of ‘(>->)’, namely ‘doubleUp’ In the second argument of ‘($)’, namely ‘loop >-> doubleUp’
Better error message:
Couldn't match type ‘[Char]’ with ‘()’ Expected type: Proxy () String () X IO () Actual type: Consumer String IO String Type-synonyms expanded: Expected: Proxy () [Char] () X IO () Actual: Proxy () [Char] () X IO [Char] In the second argument of ‘(>->)’, namely ‘doubleUp’ In the second argument of ‘($)’, namely ‘loop >-> doubleUp’