1

尝试使用元组键入匹配时遇到问题。

filterSth :: [a]->[b]->([a],[b])
filterSth _ [] = (_, [])

这意味着当第二个参数是一个空列表时,我不在乎我希望返回的元组的第一个元素。我该如何实现呢?

4

2 回答 2

7

如果您不关心元组的第一个元素并且您确定不会使用它,您可以返回undefined,即

filterSth _ [] = (undefined, [])

请记住,尝试评估undefined将导致运行时异常。

另一个想法可能是返回Either ([a], [b]) [b]

filterSth :: [a] -> [b] -> Either ([a], [b]) [b]
filterSth _ [] = Right []
-- and a case for a non-empty second argument

如果你想原封不动地返回第一个参数,你不能使用_. _意味着您不在乎参数的值是什么,并且您不会使用它。由于您使用它,因此您必须_用命名参数替换并显式返回它

filterSth a [] = (a, [])
于 2012-10-01T10:48:59.633 回答
5

如果您不关心作为元组的第一个组件返回的内容,我建议您返回一个错误,如果您不小心使用它会爆炸。

filterSth _ [] = (error "Don't use this", [])
于 2012-10-01T10:50:54.600 回答