静默减少失败

时间:2018-12-15 11:36:24

标签: f#

使用Seq.reduce时,我看到一些奇怪的行为:

printfn "%d" (Seq.reduce (*) [1..1]) // 1
printfn "%d" (Seq.reduce (*) [1..5]) // 120
printfn "%d" (Seq.reduce (*) [1..10]) // 3628800
printfn "%d" (Seq.reduce (*) [1..50]) // 0 ???

最后一个示例无法计算乘积(可能是由于溢出),但是由于某些原因仍然返回0。

似乎应该抛出异常?

1 个答案:

答案 0 :(得分:4)

不是reduce静默失败,不是乘法运算符不检查溢出。这个抛出:

printfn "%d" (Seq.reduce Checked.(*) [1..50]) 
// System.OverflowException: Arithmetic operation resulted in an overflow.

但是这个没有:

printfn "%d" (Seq.reduce Operators.(*) [1..50]) // 0 ???
  

此模块包含具有溢出的基本算术运算   检查。

module Checked

  val ( ~- ): value:  ^T ->  ^T
  val ( - ): x:  ^T1-> y:  ^T2 ->  ^T3
  val ( + ): x:  ^T1-> y:  ^T2 ->  ^T3
  val ( * ): x:  ^T1-> y:  ^T2 ->  ^T3
  val byte: value:  ^T -> byte
  val sbyte: value:  ^T -> sbyte
  val int16: value:  ^T -> int16
  val uint16: value:  ^T -> uint16
  val int: value:  ^T -> int
  val int32: value:  ^T -> int32
  val uint32: value:  ^T -> uint32
  ...

全名:Microsoft.FSharp.Core.Operators.Checked

程序集:FSharp.Core