Haskell:阶乘函数中的非详尽模式

t_d*_*lan 1 haskell pattern-matching ghci

我尝试在GHCi中实现递归因子函数,但我收到以下错误:

Prelude> fact n = n * fact (n-1)
Prelude> fact 0 = 1
Prelude> fact 1
*** Exception: <interactive>:2:1-10: Non-exhaustive patterns in function fact
Run Code Online (Sandbox Code Playgroud)

这是从哪里来的,如何在将来避免这个错误?

K. *_*uhr 7

正如人们在评论中指出的那样,GHCi 8中单行的定义取代了之前的任何定义.如果要输入多模式定义,则需要使用特殊:{:}代码来启动和结束多行命令.所以,以下工作正常:

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

(请注意,这仅适用于GHCi 8,而不适用于7.)

另外,请记住定义中的顺序.在Haskell中,模式的顺序很重要,所以如果你fact n首先尝试匹配,它将始终匹配,所以你的fact 0模式永远不会被使用..

编辑:对于GHCI 7,您需要使用let带有适当缩进的语法来输入多模式定义:

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