4

F# 有一些很好的简洁参数检查函数,可以像这样使用:

let foo (bar : string) : string =
    if bar = null then
        nullArg "bar"
    ...

然而,我更喜欢更规范的表达方式,即代码合同:

let foo (bar : string) : string =
    Contract.Requires (bar <> null, "bar is null")
...

然而,我梦想编写的代码是这样的:

let nonNull (expr : Expr) : unit =
    // quotation magic

let foo (bar : string) : string =
    nonNull <@ bar @>
    ...

问题是:这可以用 F# 表达吗?或者换一种说法,在 F# 中是否有 nonNull 的工作实现?

在我看来它不像,但也许这里有人可以验证它。

4

1 回答 1

4

正如@svick 在评论中提到的那样,这目前不会很好地工作,因为<@ bar @>实际上将表示为Value(null, typeof<string>). 因此,您可以检查该值是否为null,但您当前无法获取参数的名称。

您可以执行的部分如下所示:

open Microsoft.FSharp.Quotations

let nonNull (expr : Expr) =
  match expr with 
  | Patterns.Value(null, _) -> failwith "it is null"
  | _ -> ()

但是,这可能会在下一个版本中改进 :-) 这个F# 功能请求需要能够在引用中表示变量的名称。所以也许检查下一个版本的 F#!

于 2014-07-13T18:55:30.800 回答