[Haskell-cafe] Type information in MVars

Viktor Dukhovni ietf-dane at dukhovni.org
Sun Apr 28 10:37:50 UTC 2019


On Sun, Apr 28, 2019 at 10:56:42AM +0100, Tom Ellis wrote:

> On Sun, Apr 28, 2019 at 12:45:24PM +0300, Georgi Lyubenov wrote:
> > There are obviously a lot of cool tricks you can do with phantom
> > parameters, but they are all lost when you start looking at a `MVar`
> > holding a type with a phantom parameter.
> 
> That's an intriguing statement.  Why are they lost?

The types don't look lost to me at first blush:

    ghci> import Control.Concurrent.MVar
    ghci> import Data.Proxy
    ghci> let p = Proxy :: Proxy Int
    ghci> m <- newMVar p
    ghci> let q = Proxy :: Proxy Char
    ghci> x <- readMVar m
    ghci> q == x

    <interactive>:20:6: error:
	• Couldn't match type ‘Int’ with ‘Char’
	  Expected type: Proxy Char
	    Actual type: Proxy Int
	• In the second argument of ‘(==)’, namely ‘x’
	  In the expression: q == x
	  In an equation for ‘it’: it = q == x

    ghci> modifyMVar_ m $ const $ return q

    <interactive>:25:17: error:
	• Couldn't match type ‘Char’ with ‘Int’
	  Expected type: Proxy Int -> IO (Proxy Int)
	    Actual type: Proxy Int -> IO (Proxy Char)
	• In the second argument of ‘($)’, namely ‘const $ return q’
	  In the expression: modifyMVar_ m $ const $ return q
	  In an equation for ‘it’: it = modifyMVar_ m $ const $ return q

-- 
	Viktor.


More information about the Haskell-Cafe mailing list