繁体   English   中英

F#高阶属性访问器

[英]F# Higher-order property accessors

我刚刚将原型元组升级为记录。 有一天,它可能成为真正的一堂课。 同时,我想翻译如下代码:

type Example = int * int
let examples = [(1,2); (3,4); (5,6)]
let descs = Seq.map (fst >> sprintf "%d") examples

对此:

type Example = {
  Field1 : int
  Field2 : int
  Description : string
}
let examples = [{Field1 = 1; Field2 = 2; Description = "foo"}
                {Field1 = 3; Field2 = 4; Description = "bar"}
                {Field1 = 5; Field2 = 6; Description = "baz"}]
let descs = Seq.map Description examples

问题是,当我声明Example记录时,我希望得到一个函数Description : Example -> string ,但我没有。 我在类上进行了一些尝试,并尝试了一些属性,但这也不起作用。 我是否只是在文档中缺少某些内容,还是必须手动编写高阶访问器? (这就是我现在使用的解决方法。)

我同意最好有某种方法将实例成员用作F#中的函数值(无需显式构造lambda函数)。 实际上,F#社区对此进行了几次讨论。 这是一个相关的链接:

该讨论中的一些建议的选项是:

// This would turn '_' automatically into a lambda parameter
// (this looks okay in simple cases, but doesn't probably scale well)
examples |> Seq.map (_.Description)

// You would specify instance member using special '#' symbol
examples |> Seq.map (Example#Description)

因此,这是F#团队所意识到的,但是我认为没有任何结论是否确实是这个重要功能以及支持它的最佳方法。

examples |> Seq.map (fun e -> e.Description)

(声明一条记录不会创建任何关联的函数,但是该记录具有属性,因此,像上面一样小的lambda可以很容易地投影出某些字段。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM