2011-05-26 48 views
2

我有一個haskell程序的問題。我想要做這樣的事情:Haskell函數中的非詳盡模式

main = do 
    print $ map foo [(1, [(2, 3), (4,5)])] 

foo :: (Int, [(Int, Int)]) -> (Int, [(Int, Int)]) 
foo (a, [(b, c)]) = (a+1, [(b, c)]) 

然後我得到的運行時錯誤:

Non-exhaustive patterns in function Main.foo 

怎麼可能做出這樣的行動? 我只想訪問不在列表中的參數。

+1

另請參見Control.Arrow中的第一個''foo = first(+1)' – luqui 2011-05-26 22:20:35

回答

9

(a, [(b, c)])(1, [(2, 3), (4, 5)])不匹配,因爲後者中的列表有兩個元素,而您的模式只需要一個元素。

如果你想離開列表不變,使用這個模式來代替:

foo (a, bar) = (a+1, bar) 

現在bar將匹配[(2, 3), (4, 5)],因爲它僅僅是一個約束,將匹配正確類型的東西。

0

這不是一個錯誤,它是一個警告,告訴你有些情況下foo中的模式都不適用。如果沒有匹配的模式,程序將退出並出現錯誤,因此它會給你這個警告。

如果您100%確定此模式始終匹配,您可以選擇忽略此警告。如果該對的第二部分包含!= 1列表元素,則foo中的匹配將失敗。我很肯定你打算做這樣的事情:

foo (a, l) = (a+1, l) 

複製給定的列表。

+3

「非窮舉模式」是一個運行時錯誤。它在你傳遞一個參數的函數時發生,而且函數的模式都不匹配這個參數。還有一個編譯時警告,警告這可能發生,但這不是他所指的。 – luqui 2011-05-26 22:22:42