我想我从根本上误解了如何解决Netwire的这种问题:
我有以下测试用例:
我想取一个字符串,把它分成几行,打印每一行,然后退出。
我错过的部分是:
下面是我到目前为止掌握的代码:
import Control.Wire
main :: IO ()
main = recur mainWire
recur :: Wire () IO () () -> IO ()
recur a = do
(e,w) <- stepWire a 0 ()
case e of Left () -> return ()
Right () -> recur w
mainWire :: Wire () IO () ()
mainWire = pure "asdf\nqwer\nzxcv"
>>> once
>>> arr lines
>>> fifo
>>> arr print
>>> perform这将产生以下结果:
"asdf"然后退出。如果我删除了once,那么程序就会像预期的那样执行,重复输出完整的行列表。
我想要下面的输出:
"asdf"
"qwer"
"zxcv"我相信,我只是缺少一些直觉,关于如何正确地处理这类问题与Netwire。
发布于 2013-08-15 17:22:13
注意:这是针对较旧版本的netwire (在事件像现在这样工作之前),因此需要对代码进行一些翻译才能使其与当前版本正常工作。
如果我对你的理解是对的,你想要一条电线,产生一条线,然后当它完成的时候抑制它?说起来有点难。
顾名思义,once只产生一次,然后永远抑制。同样,您的连线正在做什么(因为您没有告诉我们),这也有点不清楚,但这并不是您通常将其放入“主”线中的东西(到目前为止,我只在andThen中使用过andThen)。
如果这是正确的,我可能会这样做,大意是:
produceLines s = produceLines' $ lines s where
produceLines' [] = inhibit mempty
produceLines' (l:ls) = pure s . once --> produceLines' ls(你可以把它写成折页之类的,我只是觉得这样比较清楚)。
如果你不知道的话,-->对andThen来说很漂亮。基本上,这会将传递的字符串拆分成行,并将它们转换为一条线,生成第一行,然后,除了删除第一个元素外,它的行为类似于一个类似的线。一旦产生所有的值,它就会无限期地抑制。
这就是你想要的吗?
更新
我明白你现在想做什么了。
你想要写的电线可以像
perform . arr print . fifo . ((arr lines . pure "asdf\nqwer\nzxcv" . once) --> pure [])圆括号中的部分产生["adf","nqwer","nzxc"]一秒钟,然后产生[]永远。fifo从前一条线路中获取值,在每个实例中添加来自前一条线路的结果(因为这样,我们必须继续生成[])。其余的是您所知道的(我使用的是类似函数的表示法,而不是箭头表示法,因为我更喜欢它,但这对您来说应该不是问题)。
https://stackoverflow.com/questions/18251054
复制相似问题