Haskell阶乘实现

Haskell阶乘实现,haskell,Haskell,我实现了如下的阶乘 factorial n = n * factorial(n-1) factorial 0 = 1 上面的代码抛出的错误 C堆栈溢出 然后我更改了代码,如下所示: factorial 0 = 1 factorial n = n * factorial(n-1) 它终于成功了。 有人能告诉我第一种代码和第二种代码的区别吗?您提供了两种情况: 阶乘n=n*阶乘n-1 阶乘0=0 当您尝试阶乘0时,Haskell将尝试将0与两个案例中的每一个进行匹配,从顶部案例开始。因为case

我实现了如下的阶乘

factorial n = n * factorial(n-1)
factorial 0 = 1
上面的代码抛出的错误

C堆栈溢出

然后我更改了代码,如下所示:

factorial 0 = 1
factorial n = n * factorial(n-1)
它终于成功了。
有人能告诉我第一种代码和第二种代码的区别吗?

您提供了两种情况:

阶乘n=n*阶乘n-1 阶乘0=0 当您尝试阶乘0时,Haskell将尝试将0与两个案例中的每一个进行匹配,从顶部案例开始。因为case n与0匹配,实际上与任何东西都匹配,所以您将始终使用顶行,就像您只编写了

阶乘n=n*阶乘n-1
另一方面,如果您颠倒顺序,Haskell将首先尝试将0与0匹配,从而触发阶乘0=1的情况。

您提供了两种情况:

阶乘n=n*阶乘n-1 阶乘0=0 当您尝试阶乘0时,Haskell将尝试将0与两个案例中的每一个进行匹配,从顶部案例开始。因为case n与0匹配,实际上与任何东西都匹配,所以您将始终使用顶行,就像您只编写了

阶乘n=n*阶乘n-1
另一方面,如果颠倒顺序,Haskell将首先尝试将0与0匹配,从而触发阶乘0=1的情况。

使用第一个定义的模式匹配将取代第二个模式中的文字0。Haskell将根据订单进行匹配。因为n匹配包括0在内的任何数字,所以永远不会得到0的基本情况


第二个定义减轻了这个错误。

使用第一个定义的模式匹配将取代第二个模式中的文字0。Haskell将根据订单进行匹配。因为n匹配包括0在内的任何数字,所以永远不会得到0的基本情况

第二个定义减轻了这一错误。

使用-Wall:GHC启用“保持警告”应警告您,在第一种情况下,第二个等式是多余的,暗示错误。使用-Wall:GHC启用“保持警告”应警告您,在第一种情况下,第二个等式是多余的,暗示错误。