2013-08-20 46 views
7

因此,昨天,雖然通過一些F#代碼作爲編碼練習的一部分,另一位開發人員指出了一些有趣的事情。我們只是做了一小段代碼來演示彙總列表。如果我做的:如何獲取列表減少拋出算術溢出

[1..100000] |> Seq.sum 

我收到以下錯誤:

System.OverflowException: Arithmetic operation resulted in an overflow. 
    at <StartupCode$FSI_0003>[email protected]() 
Stopped due to error 

但是,如果我這樣做:

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

我得到:

val it : int = 705082704 

我意識到雖然這兩段代碼應該完成相同的p要求他們非常不同。我只是好奇,有沒有辦法讓List.reduce拋出OverflowException而不是給我一個不好的答案?

+1

只是對現有答案的補充:總和'1..100000 =(100001 * 100000)/ 2 = 50000 50000 = 0x12A06B550'這是一個溢出。丟棄溢出位:「0x12A06B550 - 0x100000000 = 0x2A06B550 = 705082704」。 – bytebuster

回答

7

您可以使用一個檢查操作:

[1..100000] |> List.reduce (Checked.(+)) 
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 

通知託運(運營商)這個檢查溢出...

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