哈斯克尔。此函数如何捕获负数作为参数?

时间:2018-12-22 18:19:21

标签: haskell

我不明白,负数如何捕获此函数?

undefined

如果我的输入看起来像这样mdrop 0 [] = [] mdrop 0 (h:t) = h:t mdrop n [] = [] mdrop n (h:t) = mdrop (n-1) t 我收到一个空名单。但我不知道哪一行抓住了负数。

1 个答案:

答案 0 :(得分:7)

没有任何东西专门捕捉负数,但是减小n总是 并伴随着较短的列表,因此最终您击中了空列表,第三个方程式匹配。 n是一个不可辩驳的模式的例子;它会匹配 any 数字(正,零或负),尽管具有给定的定义,但在您确认第一个参数为非零之前,将永远不会对其进行检查。

有效地,否定参数产生的结果与足够大的参数相同,因为它始终可以递减而不会达到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) []
  == []

顺便说一句,您的前两个定义可以用单个定义代替

mdrop 0 xs = xs

由于在两个原始定义中,当第一个参数与0匹配时,您只需返回第二个参数即可。