我正在学习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
。
这里发生了什么?
答案 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]