哈斯克尔.该函数如何捕获负数作为参数?

Has*_*ell 2 haskell

我不明白,这个负数如何捕获?

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] 我收到一个空列表.但我不明白在哪一行捕获负数.

che*_*ner 7

没有抓住负数明确,但减少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时返回第二个参数.