2011-05-26 50 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