[英]Runtime error - Non-exhaustive patterns in function
我想编写一个输出从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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.