{-# LANGUAGE RankNTypes #-}
module TestTypes where
data State a = State a
data Dummy = Dummy
newtype Handler result = Handler { runHandler :: forall state . State state -> IO result }
type Resolver = String -> Handler String
eventRouter :: Resolver -> String -> IO ()
eventRouter resolver event =
runHandler (resolver event) state >> return ()
where
state :: State ()
state = undefined
{-
-- does type check
createResolver :: Resolver
createResolver = \event state -> return "result"
processor :: IO ()
processor =
getLine >>= eventRouter resolver >> processor
where
resolver = createResolver
-}
eventConsumer :: Resolver -> String -> IO ()
eventConsumer = undefined
{-
rank2.hs:34:17: error:
• Cannot instantiate unification variable ‘a0’
with a type involving foralls: Resolver -> String -> IO ()
GHC doesn't yet support impredicative polymorphism
• In the expression: undefined
In an equation for ‘eventConsumer’: eventConsumer = undefined
-}
-- does not type check when the rank 2 type isn't the "outermost" one?
createResolver :: (Resolver, Dummy)
createResolver = (\event -> Handler $ \state -> return "result", Dummy)
processor :: IO ()
processor =
getLine >>= eventConsumer resolver >> processor
where
resolver :: Resolver
resolver = fst (createResolver :: (Resolver, Dummy))
{-
• Couldn't match type ‘t’ with ‘Resolver’
‘t’ is a rigid type variable bound by
the inferred type of resolver :: t at TestTypes.hs:41:5
Expected type: (t, Dummy)
Actual type: (Resolver, Dummy)
-}