删除元素的第一个实例 (Haskell)

Removing the first instance of an element (Haskell)

我是使用 haskell 的新手,但我尝试按照 this 问题的答案来创建我自己的函数,该函数将列表和元素作为输入并删除第一个实例所述列表中的元素。

我的代码如下所示:

rem1 :: Eq a => [a] -> a -> [a]
rem1 [] _ = []
rem1 ys _ = ys
rem1 (y:ys) x   | x == y    = ys
                | otherwise = y : rem1 ys x

当我在 ghci 中加载代码时,代码会编译,但当我测试它时,列表没有改变。像这样:

Ok, one module loaded.
ghci> rem1 "abab" 'b'
"abab"

什么时候应该是这样的:

Ok, one module loaded.
ghci> rem1 "abab" 'b'
"aab"

我该如何解决这个问题?

对于除空列表之外的任何参数,第二种情况总是触发:

rem1 ys _ = ys

它说“无论参数是什么,总是 return 第一个参数”。确实如此。

您可能在考虑第二种情况与第三种情况的“比较”:第三种情况匹配 (:),第二种情况匹配“没有 (:)”。

但这不是模式匹配的工作原理。像 ys 这样的模式匹配任何东西,任何东西,不管它是否是 (:) 构造函数。所以你的第二种情况匹配任何参数。

要修复,只需删除第二种情况。你不需要它。