Что касается библиотеки streaming. Что такое m в Stream (Of a) m r? Как я мог это выяснить из документации (извините, здесь нуб)?
Я хотел бы понять, что означает этот тип, чтобы я мог решить свою конкретную проблему, когда я создаю поток запросов с помощью серванта и пытаюсь использовать его следующим образом:
post :: Maybe Int -> ClientM [BlogPost]
post = ...
stream :: Stream (Of (ClientM [BlogPost])) ClientM ()
stream = S.map posts $ S.each $ [Just p | p <- [1..5]]
main = do
let url = ...
S.print $ S.map (\x -> runClientM x url) stream
Но я получаю следующую ошибку:
• Couldn't match type ‘ClientM’ with ‘IO’
Expected type: S.Stream (S.Of (ClientM [BlogPost])) IO ()
Actual type: S.Stream (S.Of (ClientM [BlogPost])) ClientM ()





Если дано отдельно, 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.
Несколько других соглашений: f, g, h для функций, a, b, c для параметров типа, s для потока, заканчиваются на s для списков / массивов / векторов, v для вектора, суффикс T для преобразователя, префикс m для Maybe, e для Exception, префикс e для Either. Вы можете придумать что-нибудь еще?
@MCH Префикс m иногда означает Monoid, как в mappend и mconcat. Точно так же (по крайней мере, до база-4.11.0.0) префикс s также может означать Semigroup, как в sconcat и stimes.
Интересное замечание: по соглашению переменная типа с именем
mпочти всегда представляет монаду (аf- какой-то другой функтор).