【发布时间】:2025-11-28 04:15:01
【问题描述】:
我想做一些无限序列的 IO 动作处理,实时过滤它们的结果 + 在某些时刻执行一些 IO 动作: 我们有一些减少序列的功能(请参阅我的问题haskell elegant way to filter (reduce) sequences of duplicates from infinte list of numbers):
f :: Eq a => [a] -> [a]
f = map head . group
和表达
join $ sequence <$> ((\l -> (print <$> l)) <$> (f <$> (sequence $ replicate 6 getLine)))
如果我们运行它,用户可以生成任何数字序列,例如:
1
2
2
3
3
"1"
"2"
"3"
[(),(),()]
这意味着首先执行了所有 getLine 操作(示例中执行了 6 次,最后执行了过滤列表的所有 IO 操作,但我想准确地执行 IO 操作,然后对某些子序列进行排序减少完成相同的数字。
如何归档此输出:
1
2
"1"
2
3
"2"
3
3
"3"
[(),(),()]
所以我希望这个表达式不要挂起:
join $ sequence <$> ((\l -> (print <$> l)) <$> (f <$> (sequence $ repeat getLine)))
如何在不阻塞无限列表的情况下按上述方式存档实时输出?
【问题讨论】:
-
请描述您想要生成的内容,而不是假设通过查看现有代码很明显。
-
您是否假设输入是递增顺序,并且您希望在输入下一个更大的数字时输出每个唯一数字?
-
不,可以是任意数字的序列,相同数字的重复子序列必须减少为一个数字。
-
那么究竟是什么让你决定输出,例如,
"1"当你这样做的时候?是什么让你等到输入 2 之后,如果 1 再次出现在输出中会发生什么?输出似乎没有尽可能早或尽可能晚地产生。 -
@chepner 如果下一个输入与前一个不同,这意味着 seq 已“损坏”,我们可以执行前一个数字的打印操作。