如何使列表减少以引发算术溢出

时间:2013-08-20 14:19:56

标签: f#

所以,昨天在编写一些F#代码作为编码练习的一部分时,另一位开发人员指出了一些有趣的东西。我们只是快速编写一段代码来演示列表的总结。如果我这样做:

[1..100000] |> Seq.sum

我收到以下错误:

System.OverflowException: Arithmetic operation resulted in an overflow.
   at <StartupCode$FSI_0003>.$FSI_0003.main@()
Stopped due to error

但是,如果我这样做:

[1..100000] |> List.reduce (+)

我明白了:

val it : int = 705082704

我意识到虽然这两段代码应该达到同样的目的,但它们却截然不同。我只是好奇有没有办法让List.reduce抛出OverflowException而不是给我一个错误的答案?

2 个答案:

答案 0 :(得分:7)

您可以使用经过检查的运算符:

[1..100000] |> List.reduce (Checked.(+))

答案 1 :(得分:7)

来自f#源代码

[<CompiledName("Sum")>]
let inline sum (source: seq< (^a) >) : ^a = 
  use e = source.GetEnumerator() 
  let mutable acc = LanguagePrimitives.GenericZero< (^a) >
  while e.MoveNext() do
      acc <- Checked.(+) acc e.Current
  acc

注意Checked。(运算符)检查算术溢出...

http://msdn.microsoft.com/en-us/library/vstudio/ee340296.aspx