了解流式图书馆中的类型

时间:2018-05-15 06:41:00

标签: haskell streaming monads

关于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 ()

1 个答案:

答案 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实例的任何类型。这可以是MonadIO(列表),[]MaybeState等。

另一个函数有这种类型:

Reader

此处,stdinLn :: MonadIO m => Stream (Of String) m () 被约束为m实例的任何类型。 MonadIO类型类是MonadIO的子类,因为对于类型为Monad,它必须已经是MonadIO

AFAICT,Monad也是IO,但是MonadIO不是。

因此,模块中的某些功能比其他功能更受限制。 Maybe函数的约束力低于yield函数。您可以将stdinLn用作Maybe myield但不能{。}}。

关于您的具体问题,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。错误消息指出编译器期望IOm