Haskell 为什么该函数在runghc中工作,而在ghci中不工作?

Haskell 为什么该函数在runghc中工作,而在ghci中不工作?,haskell,Haskell,如果我运行以下文件: ll[]=0 ll(x:xs)=1+llxs main=putStrLn(show(ll[2,2,2])) 使用runghc,它工作并打印3 在奥托的ghci,我得到: ghci> let ll [] = 0 ghci> let ll (x:xs) = 1 + ll xs ghci> ll [3,4,43,9] *** Exception: <interactive>:23:5-25: Non-exhaustive patterns in f

如果我运行以下文件:

ll[]=0
ll(x:xs)=1+llxs
main=putStrLn(show(ll[2,2,2]))
使用runghc,它工作并打印3

在奥托的ghci,我得到:

ghci> let ll [] = 0
ghci> let ll (x:xs) = 1 + ll xs
ghci> ll [3,4,43,9]
*** Exception: <interactive>:23:5-25: Non-exhaustive patterns in function ll
ghci>让ll[]=0
让ll(x:xs)=1+llxs
ghci>ll[3,4,43,9]
***异常::23:5-25:函数ll中的非穷举模式

上述代码在ghci中无法工作的原因是什么?运行ghci时,您键入的所有内容都在IO monad中,因此您需要额外的
let
s(您确实包括了它)。然而,这导致了一个复杂问题

每次使用“let”时,您都在重新定义函数。唯一重要的是最后一个

let ll (x:xs) = 1 + ll xs
那么你错过了另一个案子

let ll [] = 0
但是,您可以在同一行上定义这两个选项,如下所示

let ll [] = 0; ll (x:xs) = 1 + ll xs

您还可以使用
:{
:}
创建多行定义。您也可以使用
:set+m
启用多行输入,但必须记住缩进代码。按几下return键完成拦网。和。这似乎是一个很常见的问题!