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