2014-09-10 65 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,即不是所有可能的列表。