[英]Pattern match is redundant, 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
这样,您可以按照自己喜欢的顺序放置图案。 此外,使用显式模式而不是通配符可以很容易地看出您已经做出了您想要的所有区别,并且没有遗漏任何重要的内容。 根据经验,只有在减少需要编写的代码行数时,贯穿模式才可能有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.