在haskell中获取列表的长度

mik*_*ika -2 haskell

所以我做了 4 个函数,“所有”函数都在空数组上返回错误

--
myLength1        :: (Num b) => [a] -> b
mylength1 []     =  0
myLength1 (_:as) =  1 + myLength1 as

--
myLength2        :: [a] -> Integer
mylength2 []     =  0
myLength2 (_:as) =  1 + myLength2 as

myLength3        :: (Num b) => [a] -> b
mylength3 []     =  0
myLength3 (a:[]) =  1
myLength3 (a:as) =  1 + myLength3 as

myLength4        :: [a] -> Integer
mylength4 []     =  0
myLength4 (a:[]) =  1
myLength4 (a:as) =  1 + myLength4 as

Run Code Online (Sandbox Code Playgroud)

ghci 输出

HCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
Prelude> 
Prelude> :load myLength.hs 
[1 of 1] Compiling Main             ( myLength.hs, interpreted )
Ok, one module loaded.
*Main> myLength1 ""
*** Exception: myLength.hs:4:1-36: Non-exhaustive patterns in function myLength1

*Main> myLength2 ""
*** Exception: myLength.hs:9:1-36: Non-exhaustive patterns in function myLength2

*Main> myLength3 ""
*** Exception: myLength.hs:(13,1)-(14,36): Non-exhaustive patterns in function myLength3

*Main> myLength4 ""
*** Exception: myLength.hs:(18,1)-(19,36): Non-exhaustive patterns in function myLength4

*Main> 
Run Code Online (Sandbox Code Playgroud)

异常消息并不是很有帮助,myLength1实际上是从http://learnyouahaskell.com/syntax-in-functions#pattern-matching复制的 。

我希望有人能向我解释什么是错的。


谢谢大家的指教!!

显然我有一个错字,但是haskell编译器不应该抱怨这个吗?

我试过

myLength1        :: (Num b) => [a] -> b
myLength2        :: [a] -> Integer
myLength3        :: (Num b) => [a] -> b
myLength4        :: [a] -> Integer
myLength4 []     =  0
myLength4 (a:[]) =  1
myLength4 (a:as) =  1 + myLength4 as
myLength3 []     =  0
myLength3 (a:[]) =  1
myLength2 []     =  0
myLength2 (_:as) =  1 + myLength2 as
myLength1 []     =  0
myLength1 (_:as) =  1 + myLength1 as
Run Code Online (Sandbox Code Playgroud)

一切都很好......而且它是不可理解的......我现在才意识到但是haskell是一种可以在任何地方编写的语言......就像我不必保持我的$#!t干净,只要它不臭。

For*_*omb 6

这是一个相当简单但很难发现的问题。让我们以 myLength1 为例:

myLength1        :: (Num b) => [a] -> b
mylength1 []     =  0
myLength1 (_:as) =  1 + myLength1 as
Run Code Online (Sandbox Code Playgroud)

您在第 1 行将函数定义为 myLength1。但是,在第 2 行,您使用名为 mylength1 的函数进行模式匹配。您收到错误“函数中的非详尽模式”的原因是第 2 行未被识别为您的基本情况,因为它们没有使用相同的函数名称。

您的其余功能似乎就是这种情况。

希望这是有道理的!