我有以下类型:
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之间的东西.这让我觉得这种类型的东西可能有更好的代表性,但是什么呢?
我正在使用流媒体库,但会接受使用管道或管道的答案.
说我有
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) 使用管道,我试图为ProxyFast或ProxyCorrect类型编写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中可以吗?)
我通过以下方式打开一些.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]?
如何使用管道库保存文件?我浏览了导管的教程,但似乎找不到任何东西,这是我的用例:
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)
所以这里有两个问题:
使用lines将字符串转换为字符串列表然后将其提供给它是否有意义sourceList?
我应该如何实现该saveFile功能,以便在xxs完全处理字符串时
,我可以将其写入磁盘?
我正在使用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) 我有以下代码与管道没有第二个管道(>-> 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获取系统时间。
haskell haskell-platform template-haskell haskell-pipes haskell-stack
haskell ×8
conduit ×4
arrows ×1
concurrency ×1
http-conduit ×1
lazy-io ×1
lifting ×1
monads ×1
stream ×1