2014-09-10 69 views
3

我发现这个代码,建立对应Thue-Morse sequence列表:交错功能

thueMorse :: [Int] 
thueMorse = 0 : interleave (map (1-) thueMorse) (tail thueMorse) 
    where interleave (x:xs) ys = x : interleave ys xs 

这是完美的,可以创造奇迹,但我不能换我的头周围。举个例子:

> take 8 thueMorse 
[0,1,1,0,1,0,0,1] 

如果我在全球范围定义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 

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

回答

6

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

interleave (x:xs) ys = x : interleave ys xs 
interleave [] ys = ys 
3

这个例外已经告诉你的错误:你的interleave的模式并不详尽。如果您尝试使用interleave [] a,会发生什么情况?第一个参数的模式只与至少有一个元素的列表匹配。这样,interleave is only defined partially,即不是所有可能的列表。