Haskell函数程序设计中的求和

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

在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: (?) :: Integer -> Integer -> Integer
Failed, modules loaded: none.
第13行是:

     | n > 1 = n + summation(n-1)
我已经对文件中的所有内容进行了注释,但仍然会出现该错误。我到处都看不到“?”。以下是屏幕截图:


在我看来,这里有两个问题:

  • 您的递归调用调用sumatoria,而您的函数是summation
  • 您检查
    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]
    

    在我看来,这里有两个问题:

  • 您的递归调用调用sumatoria,而您的函数是summation
  • 您检查
    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:在你的源代码的某个地方,两个变量之间有一个问号
    。但是我们看不到,我看不到任何地方。我上传了文件的图片并输出。非常感谢。谢谢!原始文件是西班牙文的,所以到处都是苏门答腊岛,我相信