使用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。
似乎应该抛出异常?
答案 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