[Haskell-cafe] Rank2Types and pattern matching
Dan Doel
dan.doel at gmail.com
Sun Jul 4 05:51:10 EDT 2010
On Sunday 04 July 2010 5:41:07 am Yves Parès wrote:
> Okay, I understand better, now.
> But I could never have guessed it just from the GHC error message.
>
> Another question on the same code:
>
> import Control.Monad.Identity
>
> newtype SomeMonad s a = SomeMonad { unSome :: Identity a }
> deriving (Monad)
>
> newtype SomeType s = SomeType Int
>
> runSomeMonad :: (forall s. SomeMonad s a) -> a
> runSomeMonad x = runIdentity . unSome $ x
>
> foo :: SomeType s
> foo = runSomeMonad (return $ SomeType 42)
>
>
> According to what I read about ST, it should not compile because of 'foo'
> (hence the protection), well it does.
> What have I forgotten in my code?
The s in your SomeType isn't linked in any way to the variable quantified in
the SomeMonad. You're producing:
return $ SomeType 42 :: forall t. SomeMonad t (SomeType s)
and running it to get the SomeType s. You need something to tie them together,
like:
mkSomeType :: Int -> SomeMonad s (SomeType s)
mkSomeType i = return (SomeType i)
and then hide the SomeType constructor, perhaps.
-- Dan
More information about the Haskell-Cafe
mailing list