繁体   English   中英

运行时错误-功能中的非穷举模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM