作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
使用 Haskell pipes库,我正在尝试定义 Pipe
具有以下类型:
signalExhausted :: Monad m => Pipe a (Value a) m r
Value
数据类型定义为:
data Value a = Value a | Exhausted
toList (each [] >-> signalExhausted) == [Exhausted]
toList (each xs >-> signalExhausted) == map Value xs ++ [Exhausted]
Pipes.Prelude.map Value
。 ,除了它应该产生一个额外的
Exhausted
在处理完所有上游值之后,让下游有机会执行一些最终操作。
Pipe
被定义?
> let xs = words "hubble bubble toil and trouble"
> toList $ each xs >-> signalExhausted
[Value "hubble", Value "bubble", Value "toil", Value "and", Value "trouble", Exhausted]
pipes-parse
库提供函数
draw
和
parseForever
.这些看起来很有用,但我不太明白如何将它们组合成
Pipe
符合上述规范。
最佳答案
像 signalExhausted
这样的管道无法定义,但函数等效于 (>-> signalExhausted)
能够。
>->
是 pull
category 的专用版本.执行由下游代理从上游代理中提取数据驱动。下游代理发送空请求()
上游并阻塞,直到持有值的响应从上游代理返回。当上游代理用尽并且没有任何值要发回时,它return
s。你可以看到return
这对于 each
的定义中的这些示例很重要.
each = F.foldr (\a p -> yield a >> p) (return ())
-- what to do when the data's exhausted ^
map
Value
在上游管道上方并添加
yield Exhausted
完成后。
import Pipes
import qualified Pipes.Prelude as P
data Value a = Value a | Exhausted
deriving (Show)
signalExhausted p = p >-> P.map Value >> yield Exhausted
signalExhausted
之外,这正是您正在寻找的。取代
(>-> signalExhausted)
.
let xs = words "hubble bubble toil and trouble"
print . P.toList . signalExhausted $ each xs
[Value "hubble",Value "bubble",Value "toil",Value "and",Value "trouble",Exhausted]
import Control.Monad
import Pipes.Core
returnDownstream :: Monad m => Proxy a' a b' b m r -> Proxy a' a b' (Either r b) m r'
returnDownstream = (forever . respond . Left =<<) . (respond . Right <\\)
respond
与
respond . Right
并替换
return
与
forever . respond . left
,将返回与响应一起发送到下游。
returnDownstream
比你要找的更一般。我们可以演示如何使用它来重新创建
signalExhausted
.
returnDownstream
将返回的管道转换为永不返回的管道,并将其返回值作为
Left
转发到下游
Either
的值.
signalExhausted p = returnDownstream p >-> respondLeftOnce
respondLeftOnce
是一个示例下游代理。下游代理可以辨别
Right
中保存的常规值。以及保存在
Left
中的返回值.
respondLeftOnce :: Monad m => Pipe (Either e a) (Value a) m ()
respondLeftOnce = go
where
go = do
ea <- await
case ea of
Right a -> yield (Value a) >> go
Left _ -> yield Exhausted -- The upstream proxy is exhausted; do something else
关于haskell - 向下游发信号表明上游已用尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32113297/
我想在订阅中捕获异常,但结果不符合预期。 this.userService.isUsernameValid (username) .pipe ( catchError
我是一名优秀的程序员,十分优秀!