返回 Result 类型的异常

Joh*_*Doe 3 f#

我正在尝试使用 F# 默认情况下的错误:异常。

我想使用 Result 类型处理错误,但如果我尝试返回 Exception 的特化(例如 ArgumentException)作为错误,Visual Studio 会显示“此函数接受太多参数,或者在不需要函数的上下文中使用” 。

我的来源:

let division (x: float) (y: float): Result<float, Exception> =
    if x = 0.0 then
        Error (ArgumentException ())
    else
        Ok (x / y)
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

您的代码的问题是新创建的类型ArgumentExceptionException与您在类型签名中指定的类型

您可以使用运算符安全地ArgumentException进行强制转换,但 F# 不会自动插入强制转换,因此您必须自己编写:Exception:>

let division (x: float) (y: float): Result<float, Exception> =
    if x = 0.0 then
        Error (ArgumentException () :> Exception)
    else
        Ok (x / y)
Run Code Online (Sandbox Code Playgroud)

事实上,F# 甚至可以从类型注释推断目标类型,因此您可以只写:

Error (ArgumentException () :> _)
Run Code Online (Sandbox Code Playgroud)

PS:我看到你说你收到“该函数需要太多参数”错误。这很奇怪,也许你的情况还有更多的事情发生。当我尝试你的代码时出现的错误是“这个表达式本来应该有类型,Exception但实际上是ArgumentException”所以也许你也在重新定义一些标准类型......