【问题标题】:Removing the first instance of an element (Haskell)删除元素的第一个实例 (Haskell)
【发布时间】:2021-09-10 09:58:09
【问题描述】:

我是使用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"

我该如何解决这个问题?

【问题讨论】:

  • 如果我们用-Wall 开启警告,GHC 会警告这个错误——我建议这样做。

标签: visual-studio haskell ghci


【解决方案1】:

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

rem1 ys _ = ys

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2021-12-20
    • 2018-01-12
    • 2013-09-23
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多