如果在编译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
答案 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