[英]Understanding types in the streaming libarary
在問候的streaming
libarary什么是m
的Stream (Of a) mr
? 我怎么能從文檔中弄清楚這一點(抱歉,這里有一個菜鳥) ?
我想了解這種類型的含義,以便我可以解決我使用servant創建請求流的特定問題,同時嘗試使用它:
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 ()
如果單獨給出,則Stream (Of a) mr
的m
可以是任何類型。
在考慮模塊中的特定功能時,請注意類型約束。 例如, 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
一起stdinLn
。
關於你的具體問題,OP中沒有足夠的信息用於repro,但看起來main
使用Streaming.Prelude
的map
函數:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.