Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取haskell中列表的长度_Haskell - Fatal编程技术网

获取haskell中列表的长度

获取haskell中列表的长度,haskell,Haskell,因此,我创建了4个函数,“所有”函数都会在空数组上返回一个错误 -- myLength1 :: (Num b) => [a] -> b mylength1 [] = 0 myLength1 (_:as) = 1 + myLength1 as -- myLength2 :: [a] -> Integer mylength2 [] = 0 myLength2 (_:as) = 1 + myLength2 as myLength

因此,我创建了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

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> 
异常消息并不是很有用,而
myLength1
实际上是从中复制的

我希望有人能给我解释一下怎么了


谢谢大家的启示

很明显,我有一个输入错误,但是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

一切都很好。。这是无法理解的。。我现在才意识到haskell是一种写在任何地方的语言。。就像我不必保留我的美元一样!这是一个相当简单但很难发现的问题。让我们看一下myLength1,例如:

myLength1        :: (Num b) => [a] -> b
mylength1 []     =  0
myLength1 (_:as) =  1 + myLength1 as
您在第1行将函数定义为myLength1。但是,在第2行,您可以使用名为mylength1的函数进行模式匹配。您之所以收到错误“函数中的非穷举模式”,是因为第2行未被识别为基本情况,因为它们使用的函数名称不同

这似乎是你的其他职能的情况


希望这有意义

问题是
mylength1
中的字母“l”应该是大写。
mylength1
不是为空列表定义的;您定义了一个单独的函数
mylength1
,该函数仅为空列表定义。噢,天哪。。。。打字错误。。。我希望我不会因此而获奖。。。别开玩笑了。。haskell编译器不应该为此提供错误或警告吗?@mika确实如此!“函数中的非穷举模式”表示您在函数中缺少一个模式,这是因为您的基本情况没有被涵盖。@mika这是一个很好的观点!这就是为什么建议使用
-Wall
启用警告。(可以说,默认情况下应该启用…)。您可以在文件顶部添加
{-#选项-Wall#-}
以始终启用警告。