Haskell删除列表元素首实例的自定义函数运行无效应如何修复?
问题原因
你的代码错误来自模式匹配顺序不符合执行逻辑:Haskell对函数子句的匹配是从上到下依次执行的,只要匹配到某一个子句就会直接执行不再向后校验。
你编写的第二个子句rem1 ys _ = ys会匹配所有第一个子句没接住的非空列表,直接原样返回输入列表,根本不会走到第三个处理元素判断的分支,所以测试时列表没有任何变化。
修复方案
直接删除多余的第二个匹配子句即可,修正后的代码如下:
rem1 :: Eq a => [a] -> a -> [a] rem1 [] _ = [] rem1 (y:ys) x | x == y = ys | otherwise = y : rem1 ys x
验证测试
修正后在GHCi中执行测试即可得到预期结果:
ghci> rem1 "abab" 'b' "aab"
补充说明
如果后续要写多子句的Haskell函数,一定要注意把子集范围更窄、更特殊的匹配规则放在前面,范围更宽的通用匹配规则放在后面,避免出现匹配提前截断的问题。
内容的提问来源于stack exchange,提问作者Mampenda
相关产品推荐
相关产品推荐

