7

因此,昨天在编写一些 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 而不是给我一个错误的答案?

4

2 回答 2

7

您可以使用选中的运算符:

[1..100000] |> List.reduce (Checked.(+))
于 2013-08-20T14:41:41.443 回答
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.(operator) 这个检查算术溢出...</p>

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

于 2013-08-20T14:43:07.813 回答