我如何在F#中显式使用未经检查的算术运算符

时间:2018-08-03 12:36:20

标签: f#

如果在编译F#代码时使用--checked+选项,那么如何对特定操作使用未经检查的算术。

采用其他方法很容易,只需使用FSharp.Core.Operators.Checked模块即可;但是我找不到合适的模块来获取操作员的未经检查的版本。

FSharp.Core.Operators.Unchecked模块存在,但不包含任何基本的算术运算,例如+*等。

例如:

let a = FSharp.Core.uint32.MaxValue
let b = a+1u //Alter this to get it to work?
//b should be 0,
//rather than OverflowException being thrown in the previous line
b

2 个答案:

答案 0 :(得分:4)

默认未选中的运算符在Microsoft.FSharp.Core.Operators中定义。如果仅在几个地方需要此功能,则可以通过完整的模块名称明确引用操作员:

let a = FSharp.Core.uint32.MaxValue
let b = Microsoft.FSharp.Core.Operators.(+) a 1u

答案 1 :(得分:3)

Tomas' answer的详细版本,其中未经检查的加法被重新定义以继续使用infix表示法:

以下演示程序

let (+!) x y = Operators.(+) x y

[<EntryPoint>]
let main argv = 
   try
       let _ = 1 + System.Int32.MaxValue
       printfn "Fine"
   with
       e -> printfn "Exception"

   try
       let _ = 1 +! System.Int32.MaxValue
       printfn "Fine"
   with
       e -> printfn "Exception"
   0

正在使用--checked+标志进行编译并执行打印

Exception
Fine