【发布时间】:2012-02-12 12:30:50
【问题描述】:
给定一个 F# 记录:
type R = { X : string ; Y : string }
还有两个对象:
let a = { X = null ; Y = "##" }
let b = { X = "##" ; Y = null }
和一个关于字符串的谓词:
let (!?) : string -> bool = String.IsNullOrWhiteSpace
还有一个功能:
let (-?>) : string -> string -> string = fun x y -> if !? x then y else x
有没有办法使用F#引号来定义:
let (><) : R -> R -> R
与行为:
let c = a >< b // = { X = a.X -?> b.X ; Y = a.Y -?> b.Y }
以某种方式让(><) 适用于任何任意 F# 记录类型,不仅仅适用于 R。
简短:在给定任意记录类型和适用于其字段的补码函数(-?>) 的情况下,能否使用引号为(><) 的定义动态生成F# 代码?
如果不能用引号,那还能用什么?
【问题讨论】:
-
我认为你必须使用反射来做这样的事情。
-
@svick 我知道。如果碰巧存在的话,我只是对实现这一目标的其他方法感兴趣。尤其是一些会导致 F# 代码生成的代码。
-
我看到使用 .NET 执行此操作的唯一方法是反射(正如 @svick 所建议的那样)。您还可以使用 F# 宏为您需要的每条记录自动创建函数。
-
@RamonSnir - 需要明确的是,F# 2.0 没有宏系统,我认为您是在暗指自己的工作:ramon.org.il/wp/2011/12/text-based-macro-system-for-f
-
@StephenSwensen 是的,我是。 .NET 本身(包括 F#)不支持任何好的解决方案。
标签: f# records quotations