关于streaming
图书馆m
中的Stream (Of a) m r
是什么?我怎么能从文档中找到这个(抱歉,这里有一个菜鸟)?
我想了解这个类型的含义,这样我就可以解决我在使用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 ()
答案 0 :(得分:7)
如果单独提供,{ "awards" : { "$elemMatch" : { "award" : "Turing Award" , "year" : { "$gt" : 1980}}}}
中的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
。
AFAICT,Monad
也是IO
,但是MonadIO
不是。
因此,模块中的某些功能比其他功能更受限制。 Maybe
函数的约束力低于yield
函数。您可以将stdinLn
用作Maybe
m
,yield
但不能{。}}。
关于您的具体问题,OP中没有足够的信息用于复制,但看起来stdinLn
使用main
中的map
函数:
Streaming.Prelude
此处,map :: Monad m => (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r
必须是m
个实例。在Haskell中,Monad
函数必须具有main
类型,因此在使用IO ()
表示法时,do
实例被推断为Monad
。错误消息指出编译器期望IO
为m
。