List 正确跟随类,但不接受代码

List 正确跟随类,但不接受代码,list,haskell,List,Haskell,我希望它显示所需的n个最终数字,但GHCi在代码中给出了一个错误 nLast :: int -> [a] -> [a] nLast 0 _ = [] nLast _ [] = [] nLast n (x:xs) = nultimos (n-1) xs 您可以在列表上使用两个枚举数。你给其中一个枚举器一个n项的开头,每次你都让两个枚举器产生一个希望。如果第一个运行者到达空列表,那么我们知道第二个运行者有n项仍然需要枚举 因此,我们可以通过以下方式实现这一点: nLast :: Int

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

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

您可以在列表上使用两个枚举数。你给其中一个枚举器一个
n
项的开头,每次你都让两个枚举器产生一个希望。如果第一个运行者到达空列表,那么我们知道第二个运行者有
n
项仍然需要枚举

因此,我们可以通过以下方式实现这一点:

nLast :: Int -> [a] -> [a]
nLast n ls = go (drop n ls) ls
    where go (_:xs) (_:ys) = …
          go [] ys = …
在这里,您仍然需要填写
部分。我把这当作练习


在上面的示例中,有一个我们没有介绍的模式,第一个列表是非空列表
(:u)
,第二个是空的
[]
。我们知道这是不可能发生的,但是最好是为此添加一个子句。

您在这里基本上是取
n
乘以最后一个子句,然后再乘以第一个子句。由于没有任何子句返回空列表以外的内容,因此结果将是空列表。错误是什么?关注错误,学习理解错误,将有助于您将来修复自己的代码。因此,现在就养成发布特定错误的习惯,在那之前我们可以更好地帮助您。
nultimos
=/=
nLast
[]
上的延迟模式匹配非常微妙。特别是对于那些自己无法解决这个问题的人,我建议要么解释,要么忽略它。@amalloy:同意。更新。