首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Netwire从值生成列表

使用Netwire从值生成列表
EN

Stack Overflow用户
提问于 2013-08-15 10:42:28
回答 1查看 156关注 0票数 2

我想我从根本上误解了如何解决Netwire的这种问题:

我有以下测试用例:

我想取一个字符串,把它分成几行,打印每一行,然后退出。

我错过的部分是:

  • 如何在管道的早期抑制某个值,但如果该值被拆分,并在以后产生的结果,则在所有这些结果被消耗后才会被抑制。
  • 主循环函数应该是什么样子?
  • 如果我要用“一次”

下面是我到目前为止掌握的代码:

代码语言:javascript
复制
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

这将产生以下结果:

代码语言:javascript
复制
"asdf"

然后退出。如果我删除了once,那么程序就会像预期的那样执行,重复输出完整的行列表。

我想要下面的输出:

代码语言:javascript
复制
"asdf"
"qwer"
"zxcv"

我相信,我只是缺少一些直觉,关于如何正确地处理这类问题与Netwire。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-15 17:22:13

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

如果我对你的理解是对的,你想要一条电线,产生一条线,然后当它完成的时候抑制它?说起来有点难。

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

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

代码语言:javascript
复制
produceLines s = produceLines' $ lines s where
  produceLines' [] = inhibit mempty
  produceLines' (l:ls) = pure s . once --> produceLines' ls

(你可以把它写成折页之类的,我只是觉得这样比较清楚)。

如果你不知道的话,-->andThen来说很漂亮。基本上,这会将传递的字符串拆分成行,并将它们转换为一条线,生成第一行,然后,除了删除第一个元素外,它的行为类似于一个类似的线。一旦产生所有的值,它就会无限期地抑制。

这就是你想要的吗?

更新

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

你想要写的电线可以像

代码语言:javascript
复制
perform . arr print . fifo . ((arr lines . pure "asdf\nqwer\nzxcv" . once) --> pure [])

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18251054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档