我在这里和网上搜索了一下,我找不到任何似乎可以回答这个问题的东西。我刚刚开始在大学里玩Haskell的一个模块,我在定义一个函数来计算数组的长度(本质上是预先存在的长度函数)时遇到了问题。
在我的讲义中,函数给出如下:
let len [] = 0
let len (h:t) = 1 + len t
这对我来说是有道理的,它似乎没有遗漏任何东西,我也在其他地方看到了非常相似的东西,但在 GHCi 中它抛出了一个"非详尽模式"错误,我一生都无法弄清楚为什么。
任何帮助将不胜感激,谢谢
您拥有的是两个声明,其中第二个声明掩盖了第一个声明。
您需要将len
声明为一个包含两个子句的函数。在GHCi中,你可以这样做:
:{
let len [] = 0
len (h:t) = 1 + len t
:}
:{ ... :}
窗体允许您像在*.hs
文件中一样输入多行声明。
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let len [] = 0
Prelude> let len (h:t) = 1 + len t -- this shadows the earlier len
Prelude> len [1, 2, 3]
*** Exception: <interactive>:3:5-25: Non-exhaustive patterns in function len
-- exception because the new len doesn't handle an empty list
Prelude> :{
Prelude| let len [] = 0
Prelude| len (h:t) = 1 + len t
Prelude| :}
Prelude> len [1, 2, 3]
3
Prelude>