F#参数检查

时间:2014-07-13 17:29:10

标签: f# arguments code-contracts design-by-contract quotations

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

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的工作实现?

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

1 个答案:

答案 0 :(得分: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# feature request需要能够在引文中表示变量的名称。所以也许请查看F#的下一个版本!