Haskell 使用Netwire从值生成列表
我认为我基本上误解了如何使用Netwire解决此类问题: 我有以下测试用例: 我想拿一个字符串,把它分成几行,打印每一行,然后退出 我缺少的是:Haskell 使用Netwire从值生成列表,haskell,netwire,Haskell,Netwire,我认为我基本上误解了如何使用Netwire解决此类问题: 我有以下测试用例: 我想拿一个字符串,把它分成几行,打印每一行,然后退出 我缺少的是: 如何在管道早期的某个值之后禁止,但如果该值被拆分,并且随后生成结果,则在所有这些结果被消耗之前不禁止 主循环函数应该是什么样子的 如果我用“一次” 以下是我目前掌握的代码: 导入控制.Wire main::IO() 主=重复主导线 递归::Wire()IO()->IO() 重复a=do (e,w)返回() 右()->recurw mainWire:
- 如何在管道早期的某个值之后禁止,但如果该值被拆分,并且随后生成结果,则在所有这些结果被消耗之前不禁止
- 主循环函数应该是什么样子的
- 如果我用“一次”
导入控制.Wire
main::IO()
主=重复主导线
递归::Wire()IO()->IO()
重复a=do
(e,w)返回()
右()->recurw
mainWire::Wire()IO()()
主线=纯“asdf\nqwer\nzxcv”
>>>一次
>>>arr线
>>>先进先出
>>>arr打印
>>>表演
这将产生以下结果:
"asdf"
然后退出。如果我删除一次
,那么程序将按预期执行,永远重复输出完整的行列表
我想要以下输出:
"asdf"
"qwer"
"zxcv"
我敢肯定,我在这里缺少了一些直觉,无法正确处理Netwire这类问题。注意:这是针对较旧版本的Netwire(在事件像现在这样工作之前),因此需要对代码进行一些翻译,才能使其在当前版本中正常工作
如果我没弄错的话,你想要一根能产生线的线,然后在处理完后禁止它?这有点难说
一次
顾名思义,只产生一次,然后永远禁用。同样,您的电线在做什么有点不清楚(因为您没有告诉我们),但这不是您通常放在“主”电线上的东西(到目前为止,我只在中使用过一次,然后再使用)
如果这是正确的,我可能会按照以下思路来做:
produceLines s = produceLines' $ lines s where
produceLines' [] = inhibit mempty
produceLines' (l:ls) = pure s . once --> produceLines' ls
(你可以把它写成折页之类的东西,我只是觉得这更清楚一些)
-->
对于来说很漂亮,如果你不知道的话。基本上,这会将传递的字符串拆分为多行,并将它们转换为一条导线,该导线会生成第一行一次,然后其行为类似于一条导线,除非删除了第一个元素。一旦生成所有值,它将无限期地禁用
这就是你想要的吗
更新
我明白你现在想做什么了
你试着写的电线可以按如下方式完成
perform . arr print . fifo . ((arr lines . pure "asdf\nqwer\nzxcv" . once) --> pure [])
括号中的部分在一瞬间产生[“adf”、“nqwer”、“nzxc”]
,然后永远产生[]。fifo从上一个连接中获取值,在每个实例中添加上一个连接的结果(因此,我们必须继续生成[])。剩下的就如你所知(我使用函数式符号而不是箭头符号,因为我更喜欢它,但这对你来说应该不是问题)。我找不到你正在使用的电线。请您添加相关的导入,或者如果它们是您自己的函数,请包含它们,以形成整个示例?我不认为我在这里遗漏了任何导线定义。我正在使用netwire-4.0.7。谢谢你的编辑Dan。这当然达到了我的目的:)我想我需要查看嵌套的电线。