F# Checked Arithmetics Scope

前端 未结 2 1667
小鲜肉
小鲜肉 2020-12-17 09:10

F# allows to use checked arithmetics by opening Checked module, which redefines standard operators to be checked operators, for example:

open Ch         


        
2条回答
  •  抹茶落季
    2020-12-17 09:46

    You can always define a separate operator, or use shadowing, or use parens to create an inner scope for temporary shadowing:

    let f() =
        // define a separate operator
        let (+.) x y = Checked.(+) x y
        try 
            let x = 1 +. System.Int32.MaxValue
            printfn "ran ok"
        with e ->
            printfn "exception"
        try 
            let x = 1 + System.Int32.MaxValue
            printfn "ran ok"
        with e ->
            printfn "exception"
        // shadow (+)
        let (+) x y = Checked.(+) x y
        try 
            let x = 1 + System.Int32.MaxValue
            printfn "ran ok"
        with e ->
            printfn "exception"
        // shadow it back again
        let (+) x y = Operators.(+) x y
        try 
            let x = 1 + System.Int32.MaxValue
            printfn "ran ok"
        with e ->
            printfn "exception"
        // use parens to create a scope
        (
            // shadow inside
            let (+) x y = Checked.(+) x y
            try 
                let x = 1 + System.Int32.MaxValue
                printfn "ran ok"
            with e ->
                printfn "exception"
        )            
        // shadowing scope expires
        try 
            let x = 1 + System.Int32.MaxValue
            printfn "ran ok"
        with e ->
            printfn "exception"
    
    
    f()    
    // output:
    // exception
    // ran ok
    // exception
    // ran ok
    // exception
    // ran ok
    

    Finally, see also the --checked+ compiler option:

    http://msdn.microsoft.com/en-us/library/dd233171(VS.100).aspx

提交回复
热议问题