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

これら 2 つのコードは同じ目的を達成するはずですが、非常に異なっていることがわかります。List.reduce に、悪い答えを返すのではなく、OverflowException をスローさせる方法はありますか?

4

2 に答える 2

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 に答える