Haskell 运行时错误-函数中的非穷举模式
我想写一个函数,打印出从1到n的数字列表:[1,2,…n],我知道这可以通过Haskell 运行时错误-函数中的非穷举模式,haskell,runtime-error,Haskell,Runtime Error,我想写一个函数,打印出从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 问题在哪里?如何解决 编辑: 为了达到你想要的,现在我明白了你的目标,阅读你的 addt
[1..n]
完成,但我想做我自己的函数:
addtimes n = addtimes_ [] n
addtimes_ [lst] a =
if a < 1
then [lst]
else addtimes_ [a:lst] (a-1)
main =
print $ addtimes 10
问题在哪里?如何解决
编辑:
为了达到你想要的,现在我明白了你的目标,阅读你的
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]
编辑:
为了达到你想要的,现在我明白了你的目标,阅读你的
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]
请参阅以下内容,并添加了正确的语法(和类型签名,这些对于代码文档和更好的错误消息来说都是必不可少的):
addtimes::(Num a,Ord a)=>a->[a]
addtimes n=addtimes\uuun[]
addtimes::(数量a,顺序a)=>[a]->a->[a]
添加时间=
如果a<1
然后是lst
其他地址(a:lst)(a-1)
main::IO()
主要=
打印$addtimes 10
除了引用
[lst]
(一个包含一个元素lst
)的单例列表)而不是lst
(它可以引用任何东西,在函数上下文中必须是列表,但可以是任意长度的),您已经放置了[a:lst]
(同样是一个单例列表,这次包含一个列表)不是(a:lst)
,而是由附加到lst
前面的第一个元素a
组成的列表。(括号不是出于任何语法原因而需要的,但在实践中通常是需要的,就像在上面的代码中一样,因为运算符优先级:addtimes\uua:list(a-1)
将被解析为(addtimes\ua):(list(a-1))
,这肯定不是您的意思。请参阅以下内容,并更正语法。)(并添加了类型签名,这些签名对于代码文档和更好的错误消息都至关重要):
addtimes::(Num a,Ord a)=>a->[a]
addtimes n=addtimes\uuun[]
addtimes::(数量a,顺序a)=>[a]->a->[a]
添加时间=
如果a<1
然后是lst
其他地址(a:lst)(a-1)
main::IO()
主要=
打印$addtimes 10
除了引用
[lst]
(一个包含一个元素lst
)的单例列表)而不是lst
(它可以引用任何东西,在函数上下文中必须是列表,但可以是任意长度的),您已经放置了[a:lst]
(同样是一个单例列表,这次包含一个列表)与(a:lst)
不同,由第一个元素a
组成的列表附加到lst
的前面(括号不是出于任何语法原因需要的,但在实践中通常是需要的,因为在上面的代码中,运算符优先级:addtimes\uuua:list(a-1)
将被解析为(addtimes\ua):(list(a-1))
,这肯定不是你的意思。你只为一个单例列表定义了函数:[lst]
表示一个元素的列表,你在函数体中称之为lst
。如果lst
似乎是指整个列表,那么就替换[lst]
bylst
无处不在。启用警告将在编译时发现这一点,并报告您未处理的情况(长度为/=1的列表)。强烈建议。如何启用警告?我在ghc--help
输出中找不到任何选项。您仅为单例列表定义了函数:[lst]
表示一个元素的列表,您将其称为函数体中的lst
。如果lst
似乎是指整个列表,只需将[lst]
替换为lst
。启用警告将在编译时发现此情况,并报告您未处理的情况(长度列表/=1)。强烈建议。如何启用警告?我在ghc--help
output中找不到任何选项。例如,关于类型签名,粘贴在原始代码中,并要求GHCI告诉我addtimes
的类型:t addtimes
生成结果(Ord t,Num t)=>t->[[t]]
。也就是说,您的版本返回的是列表列表列表,而不是您想要的“普通元素”列表。如果您已经包含了类型签名(并且如果您还不理解,也不要太担心(Ord a,Num a)
之类的东西,Int->[Int]
就可以满足您的需要了),那么您将从该函数中得到一个类型错误。我得到了添加签名的有用性。作为我关于类型签名的一个示例,粘贴在原始代码中,并让GHCI告诉我添加时间的类型:t addtimes
生成结果(Ord t,Num t)=>t->[[t]]
。也就是说,您的版本返回一个列表列表,而不是您想要的“普通元素”列表。如果您已经包含了类型签名(并且如果您还不理解,请不要太担心(Ord a,Num a)
之类的内容,Int->[Int]
就可以了),那么这个函数就会有一个类型错误。我得到了添加签名的有用性。