Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 运行时错误-函数中的非穷举模式_Haskell_Runtime Error - Fatal编程技术网

Haskell 运行时错误-函数中的非穷举模式

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的数字列表:[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
问题在哪里?如何解决

编辑:

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

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]
by
lst
无处不在。启用警告将在编译时发现这一点,并报告您未处理的情况(长度为/=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]
就可以了),那么这个函数就会有一个类型错误。我得到了添加签名的有用性。