2

我已经在这里和网上搜索过,但我找不到任何似乎可以回答这个问题的东西。我才刚刚开始在大学里使用 Haskell 开发一个模块,并且在定义一个计算数组长度的函数时遇到了问题(本质上是预先存在的长度函数)。

在我的讲义中,函数如下:

let len [] = 0
let len (h:t) = 1 + len t

这对我来说很有意义,它似乎没有遗漏任何东西,而且我在其他地方也看到过类似的东西,但是在 GHCi 中它抛出了一个“非详尽模式”错误,我不能一辈子我弄清楚为什么。

任何帮助将不胜感激,谢谢

4

1 回答 1

5

您拥有的是两个声明,其中第二个影响了第一个。

您需要声明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>
于 2013-10-07T18:29:16.177 回答