Итак, я поверхностно понимаю Rank2Types, но когда я попробую следующее
{-# LANGUAGE ImpredicativeTypes, RankNTypes #-}
import Data.Machine
f :: IO (Process a a)
f = return . auto $ id
GHC кашляет
Couldn't match type `MachineT m0 (Is a0) a0'
with `forall (m :: * -> *). Monad m => MachineT m (Is a) a'
Expected type: IO (Process a a)
Actual type: IO (MachineT m0 (Is a0) a0)
In the expression: return . auto $ id
In an equation for `f': f = return . auto $ id
Failed, modules loaded: none.
Итак, насколько я вижу, GHC не позволит мне поставить forall в Монаду. Существует ли принципиальная логическая причина квантификации, или это просто ограничение GHC? Или я просто делаю что-то глупое?