标签: haskell-pipes

这种请求 - 响应类型是否有标准抽象?

我有以下类型:

data S req rsp = Done rsp | Next req (rsp -> S req rsp)
Run Code Online (Sandbox Code Playgroud)

我们的想法是将其用作网络通信的纯粹表示,即:

... Next GetUser $ \uid -> Next (Login uid) $ \success -> Done success
Run Code Online (Sandbox Code Playgroud)

然后由一些不纯的函数评估eval.

现在,这是什么(如果有的话?)就我所见,这不是一个单子,也不是一个箭头.它似乎是stream/pipe/automaton/fsm和continuation monad之间的东西.这让我觉得这种类型的东西可能有更好的代表性,但是什么呢?

monads continuations haskell arrows haskell-pipes

3
推荐指数
2
解决办法
165
查看次数

流媒体库中的惯用预取

我正在使用流媒体库,但会接受使用管道或管道的答案.

说我有

import Streaming (Stream, Of)
import qualified Streaming.Prelude as S

streamChunks :: Int -> Stream (Of Thing) IO ()
streamChunks lastID = do
  flip fix 0 $ \go thingID ->
    unless (thingID > lastID) $ do
      thing <- highLatencyGet thingID
      S.yield thing
      go (thingID+1)
Run Code Online (Sandbox Code Playgroud)

为了减少延迟,我想在处理消费者中的前highLatencyGet一个Thing时并行分叉以检索下一个Thing.

显然,我可以MVar在调用之前将我的函数转换为创建新的并分叉下一批yield,等等.

但我想知道是否有一种惯用(可组合)的方法来做到这一点,这样它就可以打包在一个库中,并且可以在任意IO上使用Stream.理想情况下,我们也可以配置预取值,例如:

prefetching :: Int -> Stream (Of a) IO () -> Stream (Of a) IO ()
Run Code Online (Sandbox Code Playgroud)

concurrency haskell stream conduit haskell-pipes

3
推荐指数
1
解决办法
189
查看次数

ProxyFast / ProxyCorrect的MonadTransControl实例

使用管道,我试图为ProxyFastProxyCorrect类型编写MonadTransControl的实例。这就是我得到的:

instance MonadTransControl (ProxyFast a' a b' b) where
  data StT (ProxyFast a' a b' b) a = StProxy { unStProxy :: ProxyFast a' a b' b Identity a}
  liftWith = undefined
  restoreT = undefined
Run Code Online (Sandbox Code Playgroud)

我不知道如何编写liftWith或restoreT。其他monad转换器的实例都使用“交换” monad的函数,例如EitherT ema-> m(EitherT e Identity a),但是我在管道中找不到任何这样的函数。用于ProxyCorrect / ProxyFast的MonadTransControl的实例如何?还是不可能写一个?(如果是,则在管道4.0中可以吗?)

haskell monad-transformers haskell-pipes

2
推荐指数
1
解决办法
181
查看次数

如何将`readfile`函数的输出转换为管道的源?

我通过以下方式打开一些.txt文件:

main :: IO ()
main = do
  xxs  <- TIO.readFile pathToFile
  return ()
Run Code Online (Sandbox Code Playgroud)

.txt文件的格式

str_1 \n str_2 \n ... str_m
Run Code Online (Sandbox Code Playgroud)

我想将xxs变成一个源代码,以便它看起来像:

sourceList [str_1, str_2, ..., str_m]
Run Code Online (Sandbox Code Playgroud)

管道API是否提供了一种方法来实现它而不首先进行一些字符串操作xxs,从而使其成为形式[str_1, str_2, ..., str_m]

haskell conduit haskell-pipes

2
推荐指数
1
解决办法
133
查看次数

如何使用Conduit保存文件?

如何使用管道库保存文件?我浏览了导管的教程,但似乎找不到任何东西,这是我的用例:

main :: IO ()
main = do
  xxs  <- lines <$> (readFile filePath)
  sourceList xxs =$ pipe $$ saveFile

pipe :: Monad m => Conduit String m String
pipe = undefined
Run Code Online (Sandbox Code Playgroud)

所以这里有两个问题:

  1. 使用lines将字符串转换为字符串列表然后将其提供给它是否有意义sourceList

  2. 我应该如何实现该saveFile功能,以便在xxs完全处理字符串时 ,我可以将其写入磁盘?

haskell conduit haskell-pipes

2
推荐指数
1
解决办法
258
查看次数

为什么不打印强制整个惰性 IO 值?

我正在使用http-client教程使用 TLS 连接获取响应正文。既然我可以观察到它print是由 调用的withResponse,为什么不print强制对以下片段中的输出进行完整响应?

withResponse request manager $ \response -> do
    putStrLn $ "The status code was: " ++
    body <- (responseBody response)
    print body
Run Code Online (Sandbox Code Playgroud)

我需要写这个:

response <- httpLbs request manager

putStrLn $ "The status code was: " ++
           show (statusCode $ responseStatus response)
print $ responseBody response
Run Code Online (Sandbox Code Playgroud)

我要打印的正文是一个懒惰的 ByteString。我仍然不确定是否应该print打印整个值。

instance Show ByteString where
    showsPrec p ps r = showsPrec p (unpackChars ps) r
Run Code Online (Sandbox Code Playgroud)

haskell conduit lazy-io haskell-pipes http-conduit

2
推荐指数
1
解决办法
212
查看次数

Pipes.Safe - 如何使用mapM

我有以下代码与管道没有第二个管道(>-> P.mapM ( fillMD5)).fillMD5是一项行动a -> IO a.

runSafeT $ runEffect $
     every (senseRecursive5  startfpo)
        >-> P.mapM ( fillMD5)
        >-> P.map fp2rdf  
        >-> toNTriple houtfile   
Run Code Online (Sandbox Code Playgroud)

错误是:

Couldn't match type `IO' with `Pipes.Safe.SafeT IO'
Expected type: Pipes.Safe.SafeT IO ()
  Actual type: IO ()
In the second argument of `($)', namely
  `runEffect
Run Code Online (Sandbox Code Playgroud)

我明白的类型mapM

mapM :: Monad m => (a -> m b) -> Pipe a b m r
Run Code Online (Sandbox Code Playgroud)

但我不明白如何将其提升到Safe.SafeT

haskell lifting haskell-pipes

0
推荐指数
1
解决办法
116
查看次数

在Haskell中获取系统时间的方法是什么?

我想在我的代码中使用系统时间来记录从用户界面捕获数据时的时间。如何使用Haskell获取系统时间

haskell haskell-platform template-haskell haskell-pipes haskell-stack

-3
推荐指数
1
解决办法
65
查看次数