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作为一个例子。对不起,不清楚@皮格纳,那样的话,你的解决方案很好。我添加了一个更一般的,请参见编辑。