模式匹配是多余的,haskell



我是haskell的新手,正在学习其中一本书。我遇到了一个例子,其中我有以下错误,但我不知道为什么。

myMap :: (a -> b) -> [a] -> [b]
myMap _ _      = []
myMap f (x:xs) = f x : myMap f xs

错误在最后一行:模式匹配是多余的。

如果有人能帮忙,谢谢。

函数的第一个定义(myMap _ _(捕获任何输入。如果你仔细想想,定义是:

如果第一个参数是任意值(_(,而第二个参数是任何值(_(,则返回[]

然后第二个定义只考虑第二个参数是非空列表的情况。但当我们进入第二个定义时,所有的输入都已经得到了处理。

要解决此问题,只需交换这两个定义,这样_ _模式匹配仅在f (x : xs)不能为时应用

正如其他人所指出的,您可以交换模式匹配的顺序。但在这种情况下,我更喜欢一种不同的方法。x:xs模式不匹配的列表实际上必须为空。所以我们可以写

myMap :: (a -> b) -> [a] -> [b]
myMap _ []     = []
myMap f (x:xs) = f x : myMap f xs

这样,你就可以把图案按你喜欢的顺序排列。此外,使用显式模式而不是通配符可以很容易地看出,您已经做出了所有想要的区分,并且没有遗漏任何重要内容。根据经验,只有在减少了需要编写的代码行数的情况下,失败模式才可能有意义。

最新更新