我不明白,这个负数如何捕获?
mdrop 0 [] = []
mdrop 0 (h:t) = h:t
mdrop n [] = []
mdrop n (h:t) = mdrop (n-1) t
Run Code Online (Sandbox Code Playgroud)
如果我的输入看起来像这样mdrop (-3) [1, 2, 3, 4, 5, 7, 88, 6]
我收到一个空列表.但我不明白在哪一行捕获负数.
没有抓住负数明确,但减少n是始终伴随着一个较短的名单,所以最终你打空表和第三方程式比赛.n是无可辩驳的模式的一个例子; 它将匹配任何数字(正数,零数或负数),但是在给定定义的情况下,在您已经确认第一个参数为非零之前,它将永远不会被检查.
实际上,负参数产生与足够大的参数相同的结果,因为它总是可以递减而不会达到0.
手动追踪,
mdrop (-3) [1,2,3,4,5,7,88,6]
== mdrop (-4) [2,3,4,5,7,88,6]
== mdrop (-5) [3,4,5,7,88,6]
== mdrop (-6) [4,5,7,88,6]
== mdrop (-7) [5,7,88,6]
== mdrop (-8) [7,88,6]
== mdrop (-9) [88,6]
== mdrop (-10) [6]
== mdrop (-11) []
== []
Run Code Online (Sandbox Code Playgroud)
另外,您的前两个定义可以由单个定义替换
mdrop 0 xs = xs
Run Code Online (Sandbox Code Playgroud)
因为在两个原始定义中,只需在第一个匹配0时返回第二个参数.