运行时错误 - 函数中的非详尽模式



我想写一个函数来打印从 1 到 n 的数字列表:[1,2,...n],我知道可以通过[1..n]来完成,但我想制作自己的函数:

addtimes n = addtimes_ [] n
addtimes_ [lst] a =
if a < 1 
then [lst]
else  addtimes_ [a:lst] (a-1)
main = 
print $ addtimes 10

尽管上面的代码编译并运行,但它给出了以下运行时错误:

testing: testing.hs:(3,1)-(6,37): Non-exhaustive patterns in function addtimes_

问题出在哪里,如何解决?

请参阅以下内容,并更正语法(并添加了类型签名,认真地说,这些对于代码文档和更好的错误消息都是必不可少的(:

addtimes :: (Num a, Ord a) => a -> [a]
addtimes n = addtimes_ [] n
addtimes_ :: (Num a, Ord a) => [a] -> a -> [a]
addtimes_ lst a =
if a < 1 
then lst
else  addtimes_ (a:lst) (a-1)
main :: IO ()
main = 
print $ addtimes 10

除了引用[lst](包含lst一个元素的单例列表(而不是lst(它可以引用任何东西,在你的函数上下文中必须是一个列表,但可以是任何长度(,你放了[a:lst](再次是一个单例列表,这次包含一个列表(而不是(a:lst), 由第一个元素组成的列表a附加到lst的前面。(出于任何语法原因都不需要括号,但在实践中通常需要括号,如上面的代码,因为运算符优先级:addtimes_ a:list (a-1)将被解析为(addtimes_ a):(list (a-1)),这绝对不是你的意思。

编辑:

为了实现你想要的,现在我明白你的目标阅读你的

addtimes :: Int -> [Int]
addtimes 0       = []
addtimes n       = if n > 0
then addtimes_ 1 n
else error "Doesn't work with negatives"
addtimes_ :: Int -> Int -> [Int]
addtimes_ m n = if n > m
then m : (addtimes_ (m+1) n) 
else [n]
main = 
print $ addtimes (10)

这将创建一个列表,其中数字连续添加 1

[1,2,3,4,5,6,7,8,9,10]

最新更新