我不明白,负数如何捕获此函数?
undefined
如果我的输入看起来像这样mdrop 0 [] = []
mdrop 0 (h:t) = h:t
mdrop n [] = []
mdrop n (h:t) = mdrop (n-1) t
我收到一个空名单。但我不知道哪一行抓住了负数。
答案 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匹配时,您只需返回第二个参数即可。