9

我正在学习 Haskell,并且在使用本教程中的基本阶乘函数时遇到了问题。

基本上,我已经定义了一个阶乘:

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.hsst:

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

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

这里发生了什么?

4

3 回答 3

16

定义了两个函数,而不是一个具有两种情况的函数。在第一次运行时尝试相同的命令:set -Wall,您应该会收到名称阴影警告。要解决问题,请尝试

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

反而。

于 2013-04-12T18:30:04.580 回答
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

有关这些内容的文档,请参阅GHC 用户指南的第 2.4.3 节,“[将 GHCi 与] 多行输入一起使用”

于 2013-04-12T18:44:19.503 回答
4

请注意,也有这个漂亮的单线:

let factorial n = product [1..n]
于 2013-04-12T19:48:21.857 回答