删除元素的第一个实例 (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
这样的模式匹配任何东西,任何东西,不管它是否是 (:)
构造函数。所以你的第二种情况匹配任何参数。
要修复,只需删除第二种情况。你不需要它。
我是使用 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
这样的模式匹配任何东西,任何东西,不管它是否是 (:)
构造函数。所以你的第二种情况匹配任何参数。
要修复,只需删除第二种情况。你不需要它。