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

Ono*_*cci 7 f#

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

[1..100000] |> Seq.sum
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

但是,如果我这样做:

[1..100000] |> List.reduce (+)
Run Code Online (Sandbox Code Playgroud)

我明白了:

val it : int = 705082704
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*igh 7

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

[1..100000] |> List.reduce (Checked.(+))
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ith 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
Run Code Online (Sandbox Code Playgroud)

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

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