Haskell基本阶乘没有退出?

时间:2013-04-12 18:11:35

标签: haskell factorial

我正在学习Haskell,并且遇到来自this tutorial的基本阶乘函数的问题。

基本上,我已经定义了一个因子:

Prelude> let factorial 0 = 1
Prelude> let factorial n = n * factorial (n - 1)

类型检查:

Prelude> :t factorial
factorial :: Num a => a -> a

这是有道理的。但是,此功能的行为不会。无论输入是什么,它都会产生(interactive): out of memory

Prelude> factorial 5
(interactive): out of memory

我必须假设这是一个无限递归调用导致内存不足错误,但我不确定是什么原因导致它。 factorial 0也会发生同样的事情,即使我已明确声明这是1:

Prelude> factorial 0
(interactive): out of memory

现在,这是一个奇怪的部分:如果我在文件中定义阶乘函数,它可以正常工作。我创建了一个文件tesths.hs s.t。:

factorial 0 = 1
factorial n = n * factorial (n - 1)

然后,如果我回到GHCI并运行:l tesths.hs,我可以毫无错误地执行factorial 5

这里发生了什么?

3 个答案:

答案 0 :(得分:14)

定义了两个函数,而不是具有两个案例的单个函数。尝试使用首次运行:set -Wall的相同命令,您应该获得名称阴影警告。要解决此问题,请尝试

let factorial 0 = 1; factorial n = n * factorial (n - 1)

代替。

答案 1 :(得分:12)

您还可以使用:{ ... :}语法提供多行输入:

Prelude> :{
Prelude| let factorial 0 = 1
Prelude|     factorial n = n * factorial (n - 1)
Prelude| :}
Prelude> factorial 10
3628800
Prelude> 

同样,您可以使用多行模式和缩进与:set +m

Prelude> :set +m
Prelude> let factorial 0 = 1
Prelude|     factorial n = n * factorial (n - 1)
Prelude| 
Prelude> factorial 10
3628800
Prelude> 

注意空白行。您可以使用:unset +m关闭多线模式。

有关此内容的文档,请参阅Section 2.4.3 of the GHC User's Guide, "[Using GHCi with] Multiline input"

答案 2 :(得分:4)

请注意,这也很漂亮:

let factorial n = product [1..n]