在F#中没有抛出System.ArithmeticException

Old*_*vec 1 .net f# exception nan infinity

请考虑以下代码

let a = 5. / 0.
let b = sin a
let c = sqrt(-5.)
Run Code Online (Sandbox Code Playgroud)

它产生无限和NaN.在这两种情况下,我都想抛出一个异常(用于debuging目的).

我使用Visual Studio 2010.我将Debug/Exceptions .../Common Language Runtime Exceptions/System/System.ArithmeticException设置为"Thrown",但是在运行代码时,不会抛出任何异常.

知道为什么以及如何在NaN或Infinity上抛出异常?

Tom*_*cek 5

正如其他人所说,您必须明确检查NaN条件.如果您想使用一些高级F#功能,那么您也可以使用计算表达式.

可以定义一个构建器,在使用绑定值时自动检查Nan let!.然后你可以这样写:

check { let! a = 5. / 0.    // 'a' is checked here
        let! b = sin a      // 'b' is checked here
        let c = sqrt(-5.)   // 'c' is not checked (no 'let!')
        return a, b, c }
Run Code Online (Sandbox Code Playgroud)

对于简单的检查来说,这可能是太复杂的机制,但我发现它非常好.计算构建器的定义如下所示(您需要添加While,For以及其他一些支持所有语言构造):

open System

type CheckedBuilder() = 
  member x.Bind(v:float, f) = 
    if Double.IsNaN(v) |> not then f v
    else raise (new ArithmeticException())
  member x.Return(v) = v

let check = CheckedBuilder()
Run Code Online (Sandbox Code Playgroud)