我正在学习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.
这里发生了什么?
Sco*_*uff 14
定义了两个函数,而不是具有两个案例的单个函数.尝试使用首次运行的相同命令:set -Wall,您应该获得名称阴影警告.要解决这个问题,请尝试
let factorial 0 = 1; factorial n = n * factorial (n - 1)
代替.
pat*_*pat 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]多行输入".