无法理解haskell中的原始递归定义

mac*_*ian 3 recursion haskell tail-recursion product list

我已经很好地了解了原始递归定义是什么,但是我似乎仍然无法理解它.

例如,我似乎无法向自己解释如何执行以下操作(但我似乎能够这样做):

行使:

定义 productIt :: [Int] -> Int 给出整数列表乘积的函数,并为空列表返回1; 为什么选择此特定值作为空列表的结果?

我(当然)提出了解决方案:

productIt :: [Int] -> Int
productIt [] = 1
productIt (x:xs) = x * productIt xs
Run Code Online (Sandbox Code Playgroud)

这对于练习中的问题非常有效.然而,我似乎仍然难以绕过最后一行.

关于如何思考这一点的任何想法都将受到最高的赞赏.

Jer*_*ten 5

在英语中,您可以将最后一行读作:

数字列表的乘积是第一个数字乘以其余数字的乘积.如果没有数字,那么我们只说产品是1.

像这样将它转换为英语通常可以帮助我理解递归函数的工作原理和原因.您也可以使用头脑中的Haskell解释器来评估它:

  productIt [2,3,4]
= 2 * (productIt [3,4])
= 2 * (3 * (productIt [4]))
= 2 * (3 * (4 * (productIt [])))
= 2 * (3 * (4 * (1)))
= 2 * (3 * (4))
= 2 * (12)
= 24
Run Code Online (Sandbox Code Playgroud)