交错功能

rub*_*bik 3 recursion haskell

我发现这段代码构建了一个与Thue-Morse序列相对应的列表:

thueMorse :: [Int]
thueMorse = 0 : interleave (map (1-) thueMorse) (tail thueMorse)
    where interleave (x:xs) ys = x : interleave ys xs
Run Code Online (Sandbox Code Playgroud)

它是完美的,可以创造奇迹,但我无法绕过它.一个例子:

> take 8 thueMorse 
[0,1,1,0,1,0,0,1]
Run Code Online (Sandbox Code Playgroud)

如果我interleave全局定义函数并使用它,我得到了,并且正确地说,这是一个例外:

> let interleave (x:xs) ys = x : interleave ys xs
> interleave [1,2,3] [4,5,6]
[1,4,2,5,3,6*** Exception: <interactive>:29:5-47: Non-exhaustive patterns in function interleave
Run Code Online (Sandbox Code Playgroud)

那么,上面的工作如何?是因为它是一个无限的列表所以永远交错是安全的吗?

Car*_*arl 7

是的,它的工作原理是因为输入是一对无限列表.该定义interleave仅处理其第一个参数不为空的情况,即使用:构造函数.但是列表有第二个构造函数([]),该定义可以忽略.更完整的定义可能看起来像这样,具体取决于您希望它如何处理空输入:

interleave (x:xs) ys = x : interleave ys xs
interleave [] ys = ys
Run Code Online (Sandbox Code Playgroud)