Функция runTCPClient из сетевого канала имеет следующую подпись:
runTCPClient :: (MonadIO m, MonadBaseControl IO m)
=> ClientSettings m -> Application m -> m ()
MonadIO m
обеспечивает
liftIO :: IO a -> m a
и MonadBaseControl IO m
предоставляет
liftBase :: IO a -> m a
Нет видимой разницы. Обеспечивают ли они такую же функциональность? Если да, то почему дублирование в сигнатуре типа? Если нет, то какая разница?