【问题标题】:following the class correctly but the code is not accepted正确跟随课程,但代码不被接受
【发布时间】:2021-03-02 10:27:46
【问题描述】:

我希望它显示所需的 n 个最终数字,但 GHCi 在代码中给出错误

nLast :: int -> [a] -> [a]
nLast 0 _ = []
nLast _ [] = []
nLast n (x:xs) = nultimos (n-1) xs

【问题讨论】:

  • 你在这里基本上取n 次最后一个子句,然后一次第一个子句。由于没有任何子句返回空列表以外的其他内容,因此结果将是一个空列表。
  • 错误是什么?注意错误,学习理解它们,将帮助你在未来修复自己的代码。因此,请养成立即发布具体错误的习惯,在此之前我们可以为您提供更好的帮助。
  • nultimos ==/== nLast.

标签: list haskell


【解决方案1】:

您可以在列表中使用两个枚举器。您让其中一位枚举者领先n 项目,并且每次您让两位枚举者都产生一个希望。如果第一个跑步者到达空列表,那么我们知道第二个跑步者有n 项他们仍然需要枚举。

因此我们可以通过以下方式实现:

nLast :: Int -> [a] -> [a]
nLast n ls = go (drop n ls) ls
    where go (_:xs) (_:ys) = …
          go [] ys = …

这里还需要填写部分。我把它留作练习。

在上面的示例中,有一个我们没有涉及的模式,其中第一个列表是非空列表(_:_),第二个是空列表[]。我们知道这永远不会发生,但是为此添加一个子句可能会更好。

【讨论】:

  • [] 上的惰性模式匹配非常微妙。特别是对于那些无法自己解决这个问题的人,我建议要么解释它,要么忽略它。
  • @amalloy:同意。已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2011-04-15
相关资源
最近更新 更多