交错功能

时间:2014-09-10 18:09:58

标签: haskell recursion

我发现这段代码构建了一个与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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

该异常已经告诉您错误:您interleave的模式并非详尽无遗。如果您尝试使用interleave [] a会怎样?第一个参数的模式仅匹配具有至少一个元素的列表。这样,interleave is only defined partially,即不适用于所有可能的列表。