gpt4 book ai didi

exception-handling - 如何在 F# 中实现空安全运算符

转载 作者:行者123 更新时间:2023-12-04 07:53:47 26 4
gpt4 key购买 nike

我想知道您是否可以在 F# 中添加类似“null-safe”-operator 之类的东西。我知道在 C# 中可能会有这样的运算符用于下一个更大的版本。

如果没有办法实现这种行为,有没有办法包装一个可能抛出 NullReferenceException 的语句进入一个捕获异常并只返回 null 的 block .

我想到了类似的东西:

let sth = %% <@ someobject.method().another().andAnother() @>

在哪里 %%是执行表达式并检查异常的自定义运算符。

我做的一个尝试是:

open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Linq.QuotationEvaluation

let (~%%) (right:Expr) =
try
right.CompileUntyped()
right()
with
| ex -> null

但这并没有达到我想要的效果(实际上它甚至没有编译:)

我通读了:
  • http://msdn.microsoft.com/de-de/library/ee370577.aspx
  • http://msdn.microsoft.com/de-de/library/dd233197.aspx
  • 以及更多 msdn 文档

  • 有谁知道如何优雅地为链式方法创建这样的单行 try-catch?

    最佳答案

    我认为你不能实现像 .? 这样的东西。运算符以一种实用且语法方便的方式为 C# 提议,将 F# 作为库功能。虽然,我认为这将是一个非常有用的语言扩展,所以我会将它提交给 F# user voice也许submit a pull request :-)。

    异常处理。 您的代码示例与 C# 不太一样,因为您只是在处理任意异常。 C# 特性的关键在于它插入了 null在每个 . 之后检查- 你可以通过转换报价然后编译它来做到这一点,但编译会很慢。您的功能实际上可能只是:

    let orNull f = try f () with :? NullReferenceException -> null

    然后你可以写
    orNull <| fun () -> x.Foo().Bar()

    .. 但如前所述,这只是将代码包装在标准 try 中。 block 并处理异常,因此它不会做与 C# 代码相同的事情。

    计算生成器。 如果你想要一个更高级的 F# 解决方案,你可以想出一个计算表达式构建器,让你编写如下内容:
    safe { let! a = x.Foo()
    let! b = a.Bar()
    return b }

    这可以像 C# .? 一样进行空值检查。运算符,但是您需要为方法调用链的每个部分单独绑定(bind),因此需要更多输入。计算构建器在 Bind 中插入隐藏的空检查。像这样的成员:
    type NullBuilder() = 
    member x.Return(v) = v
    member x.Bind(v, f) = if (box v) = null then null else f v

    let safe = NullBuilder()

    关于exception-handling - 如何在 F# 中实现空安全运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23369109/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com