Если задано отдельно, m
в Stream (Of a) m r
может быть любого типа.
При рассмотрении конкретных функций в модуле учитывайте ограничение типа.Например, функция yield
имеет такой тип:
yield :: Monad m => a -> Stream (Of a) m ()
Здесь m
ограничен любым типом, который является экземпляром Monad
.Это может быть IO
, []
(список), Maybe
, State
, Reader
и т. Д.
Другая функция имеет такой тип:
stdinLn :: MonadIO m => Stream (Of String) m ()
Здесьm
должен быть любым типом, который является экземпляром MonadIO
.Класс типа MonadIO
является подклассом Monad
, в том смысле, что для типа, равным MonadIO
, он уже должен быть Monad
.
AFAICT, IO
такжеMonadIO
, но, например, Maybe
нет.
Таким образом, некоторые функции в модуле более ограничены, чем другие.Функция yield
менее ограничена, чем функция stdinLn
.Вы можете использовать Maybe
как m
с yield
, но не с stdinLn
.
Что касается вашей конкретной проблемы, в OP недостаточно информации для воспроизведения, но похоже, что main
использует функцию map
из Streaming.Prelude
:
map :: Monad m => (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r
Здесь m
должен быть Monad
экземпляром.В Haskell функция main
должна иметь тип IO ()
, поэтому при использовании нотации do
экземпляр Monad
выводится как IO
.Сообщение об ошибке гласит, что компилятор ожидает, что m
будет IO
.