Function Haskell中1000以下3和5的倍数之和

Function Haskell中1000以下3和5的倍数之和,function,haskell,types,Function,Haskell,Types,以下工作很好: sdb n = sum [n,n*2..999] main = print $ sdb 3 + sdb 5 - sdb 15 但它并没有那么有效,因为每次调用sdb时,它必须求和999/n次。 当我重写sdb时: sdb n = let x = quot 999 n in n*x*(x+1)/2 而runhaskell整个代码,我得到了整整一页的错误。总结起来: ... No instance for (Show a0) arising from a use

以下工作很好:

sdb n = sum [n,n*2..999]
main = print $ sdb 3 + sdb 5 - sdb 15
但它并没有那么有效,因为每次调用sdb时,它必须求和999/n次。 当我重写sdb时:

sdb n = 
    let x = quot 999 n
    in n*x*(x+1)/2
runhaskell
整个代码,我得到了整整一页的错误。总结起来:

... No instance for (Show a0) arising from a use of `print'
... No instance for (Integral a0) arising from a use of `sdb'
... No instance for (Num a0) arising from a use of `-'
我为sdb添加了类型声明:

sdb :: Integer -> Integer
但我还有一个错误:

No instance for (Fractional Integer) arising from a use of `/'
    Possible fix: add an instance declaration for (Fractional Integer)
    In the expression: n * x * (x + 1) / 2
    In the expression: let x = quot 999 n in n * x * (x + 1) / 2
    In an equation for `sdb':
        sdb n = let x = quot 999 n in n * x * (x + 1) / 2
我不明白

  • 我应该纠正什么?你能解释一下我为什么会犯这些错误吗? 已解决:我用
    div
    更改了
    /

  • 是否有更惯用和/或简洁的方法来编写相同的算法

  • 这个怎么样:

    sum [x | x <- [1..999], x `mod` 3 == 0 || x `mod` 5 == 0]
    
    这个怎么样:

    sum [x | x <- [1..999], x `mod` 3 == 0 || x `mod` 5 == 0]
    

    它是
    整数
    Integral
    是一个类型类。谢谢,已更正,但我仍然在
    n*x*(x+1)/2中得到一个错误
    /
    仅为分数定义。您可以使用
    quot
    div
    来代替。我在重写sdb函数opps-sorry-nevermindIt的
    Integer
    时已经这样做了
    Integral
    是一个类型类。谢谢,已更正,但我仍然在
    n*x*(x+1)/2中得到一个错误
    /
    仅为分数定义。您可以使用
    quot
    div
    来代替。我在重写sdb函数opps-sorry-nevermindshorter时就已经这么做了,当然是更短,但更慢了:/。我要求用一种更为惯用和/或简洁的方式来编写相同的算法,因为我是Haskell的新手,我想学习最好的语法更为惯用和简洁。看看这段代码,很容易看出实际发生了什么,它几乎就像问题本身的说明(将1到999之间的所有数字相加,这些数字可以被3或5整除)。我确实同意它的速度较慢,但只有当你在哪里使用比
    999
    高得多的上限时,这才有关系。哦,当然,但我把999作为一个例子。对不起,不清楚@皮格纳,那样的话,你的解决方案很好。我添加了一个更通用的算法,请参见edit.shorter,当然了,但速度较慢,它的算法与我的不同。我要求用一种更为惯用和/或简洁的方式来编写相同的算法,因为我是Haskell的新手,我想学习最好的语法更为惯用和简洁。看看这段代码,很容易看出实际发生了什么,它几乎就像问题本身的说明(将1到999之间的所有数字相加,这些数字可以被3或5整除)。我确实同意它的速度较慢,但只有当你在哪里使用比
    999
    高得多的上限时,这才有关系。哦,当然,但我把999作为一个例子。对不起,不清楚@皮格纳,那样的话,你的解决方案很好。我添加了一个更一般的,请参见编辑。