Haskell函数程序设计中的求和
在Haskell中编写简单函数时遇到问题。。。这意味着计算从1到n的数字之和。我不允许使用if语句,因为我的老师希望我们专注于函数编程。任何帮助都将不胜感激。谢谢Haskell函数程序设计中的求和,haskell,recursion,functional-programming,Haskell,Recursion,Functional Programming,在Haskell中编写简单函数时遇到问题。。。这意味着计算从1到n的数字之和。我不允许使用if语句,因为我的老师希望我们专注于函数编程。任何帮助都将不胜感激。谢谢 summation :: Integer -> Integer summation n | n > 1 = n + summation(n-1) | n == 1 = 1 这是GHCi的输出: clase4.hs:13:28: error: Variable not in scope: (?) :: In
summation :: Integer -> Integer
summation n
| n > 1 = n + summation(n-1)
| n == 1 = 1
这是GHCi的输出:
clase4.hs:13:28: error:
Variable not in scope: (?) :: Integer -> Integer -> Integer
Failed, modules loaded: none.
第13行是:
| n > 1 = n + summation(n-1)
我已经对文件中的所有内容进行了注释,但仍然会出现该错误。我到处都看不到“?”。以下是屏幕截图:
在我看来,这里有两个问题:
n>1
和n==1
,这是相当不安全的总和
取代苏门答腊
来解决问题,并使警卫更加安全:
summation :: Integer -> Integer
summation n
| n >= 1 = n + summation (n-1)
| otherwise = 0
此外,1..n
或0..n
之和可通过以下公式计算:
n
---
\ n * (n+1)
/ i = ---------
--- 2
i=1
div::Integral a=>a->a->a
要求a
为Integral
。如果乘法、增量和除法都是O(1)运算,那么现在这是一个O(1)函数
最后请注意,除了使用递归之外,还可以使用诸如sum
之类的函数。在这种情况下,您可以使用:
summation :: (Enum a, Num a) => a -> a
summation n = sum [1..n]
在我看来,这里有两个问题:
n>1
和n==1
,这是相当不安全的总和
取代苏门答腊
来解决问题,并使警卫更加安全:
summation :: Integer -> Integer
summation n
| n >= 1 = n + summation (n-1)
| otherwise = 0
此外,1..n
或0..n
之和可通过以下公式计算:
n
---
\ n * (n+1)
/ i = ---------
--- 2
i=1
div::Integral a=>a->a->a
要求a
为Integral
。如果乘法、增量和除法都是O(1)运算,那么现在这是一个O(1)函数
最后请注意,除了使用递归之外,还可以使用诸如sum
之类的函数。在这种情况下,您可以使用:
summation :: (Enum a, Num a) => a -> a
summation n = sum [1..n]
在源文件
clase4.hs
中,您认为是表达式n-1
中标准ASCII减号的字符不是。相反,您可能使用了其他一些unicode字符,如“en-dash”或看起来只有负号的字符(可能是因为您使用了一些奇怪的东西(如Microsoft Word)编辑了文件,或者复制并粘贴了一些与字符混淆的源代码)
Haskell正在将无效字符打印为“?”,因为据它所知,您的输出终端不支持显示错误字符所需的编码。(在Windows环境中运行Haskell时,这是一个常见的问题,但如果设置得很奇怪,可能会在其他平台上发生。)
用合适的文本编辑器打开源文件,突出显示“减号”,然后在键盘上重新键入。在西班牙语键盘上,这应该是右下shift键左侧的键;在美国键盘上,它位于零键的右侧
如果失败,请尝试将您自己的程序从Stack Overflow复制并粘贴到一个全新的文本文件中,然后进行编译——从您的问题中复制并粘贴对我们其他人来说效果很好。在您的源文件
clase4.hs
中,您认为是表达式n-1
中的标准ASCII减号的字符不是。相反,您可能使用了其他一些unicode字符,如“en-dash”或看起来只有负号的字符(可能是因为您使用了一些奇怪的东西(如Microsoft Word)编辑了文件,或者复制并粘贴了一些与字符混淆的源代码)
Haskell正在将无效字符打印为“?”,因为据它所知,您的输出终端不支持显示错误字符所需的编码。(在Windows环境中运行Haskell时,这是一个常见的问题,但如果设置得很奇怪,可能会在其他平台上发生。)
用合适的文本编辑器打开源文件,突出显示“减号”,然后在键盘上重新键入。在西班牙语键盘上,这应该是右下shift键左侧的键;在美国键盘上,它位于零键的右侧
如果失败了,试着将你自己的程序从堆栈溢出复制粘贴到一个全新的文本文件中,并编译它——从你的问题复制粘贴对我们其他人来说很好。
?
不在代码中。你能创建一个吗?顺便说一下,我只写了一个。文件中没有出现“?”,所以我不确定是什么导致了这个错误。在问题消失之前,你能试着把问题再隔离一些吗?然后发布产生错误的代码。对于值<1
?
不在该代码中,您将面临非详尽模式的异常。你能创建一个吗?顺便说一下,我只写了一个。文件中没有出现“?”,所以我不确定是什么导致了这个错误。在问题消失之前,你能试着把问题再隔离一些吗?然后发布产生错误的代码。您将面临非详尽模式
值异常<1
非常感谢!原来的文件是西班牙文的,所以到处都是苏门答腊,我把它翻译成了汇总,因为我把它贴在了这里,但忘了更改那个。我喜欢你的方法,但我还是想理解为什么我的方法不起作用。@SantiagoAguilar:在你的源代码的某个地方,两个变量之间有一个问号?
。但是我们看不到,我看不到任何地方。我上传了文件的图片并输出。非常感谢。谢谢!原始文件是西班牙文的,所以到处都是苏门答腊岛,我相信