计算haskell中数组的长度 - 非穷举模式错误

lea*_*ode 2 haskell non-exhaustive-patterns

我一直在这里和网上搜索,我找不到任何似乎回答这个问题的东西.我只是刚刚开始在Haskell上学习大学的模块,而我在定义一个函数来计算数组的长度(本质上是预先存在的长度函数)时遇到了问题.

在我的讲义中,功能如下:

let len [] = 0
let len (h:t) = 1 + len t
Run Code Online (Sandbox Code Playgroud)

这对我来说是有道理的,它似乎没有遗漏任何东西,我也看到过其他地方发布过的非常相似的东西,但是在GHCi中它会抛出一个"非详尽的模式"错误而且我无法生活我找出原因.

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

Ina*_*thi 5

你所拥有的是两个声明,第二个声明影响第一声明.

您需要将len两个子句声明为一个函数.在GHCi中,你可以这样做:

:{
let len [] = 0
    len (h:t) = 1 + len t
:}
Run Code Online (Sandbox Code Playgroud)

:{ ... :}表格可以让你输入多行的声明,你会在一个*.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>
Run Code Online (Sandbox Code Playgroud)