【问题标题】:Using Netwire to spawn lists from a value使用 Netwire 从值生成列表
【发布时间】:2013-08-15 10:42:28
【问题描述】:

我认为我从根本上误解了如何使用 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 解决此类问题的正确方法的直觉。

【问题讨论】:

  • 我找不到您使用的电线。您能否添加相关的导入,或者如果它们是您自己的函数,请包含它们,以制作整个示例SSCCE
  • 我不相信我在这里遗漏了任何电线定义。我正在使用 netwire-4.0.7。
  • 感谢丹的编辑。

标签: haskell netwire


【解决方案1】:

注意:这是针对旧版本的 netwire(在事件像现在这样工作之前),因此需要对代码进行一些翻译才能使其在当前版本中正常工作。


如果我没听错的话,你想要一根能产生线的线,然后在它完成时抑制?有点难说。

once 顾名思义,只产生一次,然后永远禁止。同样,您的电线在做什么有点不清楚(因为您没有告诉我们),但这不是您通常放入“主”电线的东西(到目前为止,我只使用过onceandThen)。

如果那是正确的,我可能会这样做:

produceLines s = produceLines' $ lines s where
  produceLines' [] = inhibit mempty
  produceLines' (l:ls) = pure s . once --> produceLines' ls

(你可以把它写成折叠之类的,我只是觉得这样更清楚一点)。

--&gt; 很适合andThen,以防你不知道。基本上,这会将传递的字符串分成几行,并将它们变成一条产生第一行的线,然后除了删除第一个元素外,它的行为就像一条类似的线。一旦产生所有值,它就会无限期地抑制。

这是你想要的吗?

更新

我明白你现在想做什么了。

你试图写的线可以做为

perform . arr print . fifo . ((arr lines . pure "asdf\nqwer\nzxcv" . once) --> pure [])

括号中的部分一瞬间产生["adf","nqwer","nzxc"],然后永远产生[]。 fifo 从前一条线路中获取值,在每个实例中添加前一条线路的结果(因为我们必须继续产生 [])。其余的如您所知(我使用的是函数式表示法而不是箭头表示法,因为我更喜欢它,但这对您来说应该不是问题)。

【讨论】:

  • 这当然实现了我所追求的 :) 我想我需要研究嵌套线。
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
相关资源
最近更新 更多