Haskell基本阶乘没有退出?

Aza*_*Aza 8 haskell factorial

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

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

Prelude> let factorial 0 = 1
Prelude> let factorial n = n * factorial (n - 1)
Run Code Online (Sandbox Code Playgroud)

类型检查:

Prelude> :t factorial
factorial :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

这是有道理的.但是,此功能的行为不会.(interactive): out of memory无论输入是什么,它都会导致结果.

Prelude> factorial 5
(interactive): out of memory
Run Code Online (Sandbox Code Playgroud)

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

Prelude> factorial 0
(interactive): out of memory
Run Code Online (Sandbox Code Playgroud)

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

factorial 0 = 1
factorial n = n * factorial (n - 1)
Run Code Online (Sandbox Code Playgroud)

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

这里发生了什么?

Sco*_*uff 14

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

let factorial 0 = 1; factorial n = n * factorial (n - 1)
Run Code Online (Sandbox Code Playgroud)

代替.

  • 它是.在ghci中`let ...`真的是'让......在'.这绝对不是ghci有点奇怪的事情 - 结果的显示方式不同,取决于它的类型是`Show a => a`,`Show a => IO a`,还是`IO()`. (3认同)

pat*_*pat 12

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

Prelude> :{
Prelude| let factorial 0 = 1
Prelude|     factorial n = n * factorial (n - 1)
Prelude| :}
Prelude> factorial 10
3628800
Prelude> 
Run Code Online (Sandbox Code Playgroud)

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

Prelude> :set +m
Prelude> let factorial 0 = 1
Prelude|     factorial n = n * factorial (n - 1)
Prelude| 
Prelude> factorial 10
3628800
Prelude> 
Run Code Online (Sandbox Code Playgroud)

注意空白行.你可以用多线模式关闭:unset +m.

有关此内容的文档,请参阅GHC用户指南的第2.4.3节"[使用GHCi]多行输入".