在Haskell中将异常序列实现为无限列表

Arn*_*ack 4 algorithm haskell sequence lazy-sequences

我有两个元素作为列表的开头[1、2]

这种不同寻常的顺序是,它会复制跟随三个元素的某种类型的位数。例如,在1和2之后,我们将有另一个2,然后是两个1。所需列表的前几个元素将产生

[1、2、2、1、1、1、2、1、2、2、1、2、2、1、1、2、1、1、2、2]因为

1  2   2  1 1   2  1  2   2  1   2   2
Run Code Online (Sandbox Code Playgroud)

其中前面的数字表示同一数字的最小序列的长度。

到目前为止,我已经尝试使用该replicate函数根据列表中前面的元素重复相同的数字。

selfrle :: [Int]
selfrle = 1 : 2 : [x | a <- [0..], let x = replicate (selfrle !! a) (selfrle !! (a + 1))) ]
Run Code Online (Sandbox Code Playgroud)

问题是我不知道为什么它不起作用。

Dan*_* D. 5

并不奇怪,它出现在OEIS中,网址https://oeis.org/A000002,并在此处被称为Kolakoski序列。在那里,他们甚至提供了John Tromp 2011年的Haskell程序:

a = 1:2: drop 2 (concat . zipWith replicate a . cycle $ [1, 2])
Run Code Online (Sandbox Code Playgroud)