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的工作实现?
它看起来不像我,但也许有人可以验证它。
答案 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#的下一个版本!