首页 > 解决方案 > 在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

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实际上是从 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

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

标签: haskell

解决方案


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

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

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

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

希望这是有道理的!


推荐阅读