簡體   English   中英

了解流式圖書館中的類型

[英]Understanding types in the streaming libarary

在問候的streaming libarary什么是mStream (Of a) mr 我怎么能從文檔中弄清楚這一點(抱歉,這里有一個菜鳥)

我想了解這種類型的含義,以便我可以解決我使用s​​ervant創建請求流的特定問題,同時嘗試使用它:

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) mrm可以是任何類型。

在考慮模塊中的特定功能時,請注意類型約束。 例如, yield函數具有以下類型:

yield :: Monad m => a -> Stream (Of a) m ()

這里, m被約束為Monad實例的任何類型。 這可能是IO[] (列表), MaybeStateReader等。

另一個函數有這種類型:

stdinLn :: MonadIO m => Stream (Of String) m ()

這里, m被約束為MonadIO實例的任何類型。 MonadIO類型類是Monad的子類,在某種意義上,對於MonadIO類型,它必須已經是Monad

AFAICT, IO也是MonadIO ,但是例如Maybe不是。

因此,模塊中的某些功能比其他功能更受限制。 yield函數比stdinLn函數的約束更少。 您可以將Maybe作為myield ,但不能與stdinLn一起stdinLn

關於你的具體問題,OP中沒有足夠的信息用於repro,但看起來main使用Streaming.Preludemap函數:

map :: Monad m => (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r

這里, m必須是Monad實例。 在Haskell中, main函數必須具有IO ()類型,因此在使用do表示法時, Monad實例被推斷為IO 錯誤消息指出編譯器期望mIO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM