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 的工作实现?
在我看来它不像,但也许这里有人可以验证它。