msdn页面记录Records (F#)详细信息record expressions
为记录构造和record patterns
为解构,后者没有命名为它们。 下面是其中同时使用技术算术运算符的例子:构建和解构记录
// Simple two-dimensional generic vector defintion
type 'a UV =
{ U : 'a; V : 'a }
static member inline (+) ({ U = au; V = av }, { U = bu; V = bv }) =
{ U = au + bu; V = av + bv }
这看似笨拙,不是很可读。对于解构,有点符号或功能作为替代。由于点符号操作符在规范(an expression’s type may be inferred from a record label
)的8.4.2节名称分辨率和记录字段标签中有特殊配置,通常不需要注释。 Accessor功能像let u { U = u } = u
不会给我们任何优势。
对于构造,我认为可以为一个函数作为记录构造函数。原来的构造函数访问甚至可以被限制:
type 'a UV =
internal { U : 'a; V : 'a }
let uv u v = { U = u; V = v }
type 'a UV with
static member inline (+) (a, b) =
uv (a.U + b.U) (a.V + b.V)
这是一个地道的事是什么?如何在模块中打包这些函数并处理命名空间问题?
尽管镜头非常适合组合,但我并没有完全跟踪您在定义某些数据结构时内在实现它们的好处。正如你的[链接](http://bugsquash.blogspot.fr/2011/11/lenses-in-f.html)通过扩展方法演示的那样,它们也可以追溯地引入。这个问题的动机是希望避免在简洁和可读性方面重构记录定义。无论如何,如果您能稍后将镜头锁定,镜头如何帮助我? – kaefer
@kaefer我在更新中回答了你。 – Gustavo