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_Recursion - Fatal编程技术网

Haskell 数域之和

Haskell 数域之和,haskell,recursion,Haskell,Recursion,编写一个名为rangeSum的函数,该函数接受两个整数,并返回从第一个整数到第二个整数(包括第一个整数)的所有整数的总和。我还没有定义如果第二个参数更大,函数会做什么,比如rangeSum 5 3。在这里什么是明智的行为 这是我到目前为止编写的代码: rangeSum :: Integer -> Integer -> Integer rangeSum x y | x == y = 0 | x > y = error "rangeSum: First

编写一个名为
rangeSum
的函数,该函数接受两个整数,并返回从第一个整数到第二个整数(包括第一个整数)的所有整数的总和。我还没有定义如果第二个参数更大,函数会做什么,比如
rangeSum 5 3
。在这里什么是明智的行为

这是我到目前为止编写的代码:

rangeSum :: Integer -> Integer -> Integer
rangeSum x y 
   | x == y = 0 
   | x > y  = error "rangeSum: First number cannot be bigger than the second number"
   | otherwise = undefined

我不知道如何用替换
未定义的
,而
未定义的
可以在代码中写入
sum[x..y]

x>y
时,也可以返回
sum[y..x]

但是,如果要强调
x
不能大于
y
,则可以返回类型为
Maybe Integer
的值,而只返回
Integer
,这样,如果
x>y
则可以返回
Nothing
,否则只返回$sum[x..y]

因此,您的代码可以如下所示:

rangeSum::Integer->Integer->Maybe Integer
范围和x y
|x>y=无
|否则=仅$sum[x..y]
您还可以使用递归解决此问题:

rangeSum::Integer->Integer->Integer
范围和x y
|x==y=0
|x>y=错误“…”
|否则=x+范围和(x+1)y
。。。或者…:

rangeSum::Integer->Integer->Maybe Integer
范围和x y
|x>y=无
|否则=让
辅助对象x y | x==y=0
辅助对象x y=x+辅助对象(x+1)y in
只要$x y

提示:3+4+5+…+y=3+(4+5+…+y)。参见上面@leftaroundabout的提示。与x>y的情况相同,3+4+5=5+4+3允许您使用smarty裤子答案吗?然后,您还可以使用高斯快捷方式计算第一个和最后一个元素的和,并将该和乘以数字量的一半。这无疑有助于解决问题,但有没有可能使用递归来解决它?