如何过滤掉序列中的连续重复?

Zai*_*aid 9 sequence raku

我正在尝试生成一个Seq不允许连续重复的随机选项:

> (<F R U>.roll(*).grep(* ne *))[^10]
((R F) (F U) (R F) (F R) (U R) (R F) (R F) (U F) (R U) (U R))
Run Code Online (Sandbox Code Playgroud)

为什么grep以这种方式使用会导致嵌套对?我怎样才能实现我正在寻找的东西?使用.flat上面仍然允许连续重复。

( R U F U F U R F R U ... )
Run Code Online (Sandbox Code Playgroud)

Jon*_*ton 14

我怎样才能实现我正在寻找的东西?

我相信该squish方法会做你想做的事:

say <F R U>.roll(*).squish.head(20)
Run Code Online (Sandbox Code Playgroud)

这产生:

(U R F U F R F R F U F R U R F U R U R F)
Run Code Online (Sandbox Code Playgroud)

为什么以这种方式使用 grep 会导致嵌套对?

因为grepmap也一样)在 arity 大于 1 的东西上将通过将列表分成该大小的块来工作。因此A B C D,对grep块的第一次调用得到A B,第二次调用C D,依此类推。然而,在这种情况下真正需要的是滞后值。可以使用state传递给的块中的变量grep来实现这一点,但是对于这个问题squish是一个更简单的解决方案。