F# 参数检查

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

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

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

然而,我更喜欢更规范的表达方式,如代码契约(Contract):
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 的有效实现?

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

最佳答案

正如@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#!

关于F# 参数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725358/

相关文章:

sorting - F# - 如何按降序然后升序对列表进行排序?

concurrency - 分布式系统上的邮箱处理器

c# - 组合接口(interface)的代码契约

.net - F#中的数组协方差

F# 变量脱离上下文

javascript - 如何动态获取执行另一个Function的Function Name?

ios - 不兼容的指针类型将“int”发送到“va_list”类型的参数(又名“char”)

python - 如何在命令行中将参数传递给文件并使用 python 更改文件中的字符串?

c# - 代码契约(Contract)不能反转条件?

C# - 代码契约(Contract) - 检测到的表达式语句评估潜在的副作用