获取haskell中列表的长度
因此,我创建了4个函数,“所有”函数都会在空数组上返回一个错误获取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
--
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#-}
以始终启用警告。