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