F#高阶属性访问器

时间:2010-06-07 20:40:40

标签: f# properties record accessor higher-order-functions

我刚刚将原型元组升级为记录。总有一天它可能会变成一个真正的阶级。与此同时,我想翻译这样的代码:

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,但我没有。我已经戳了一下并尝试了类的属性,但这也不起作用。我只是遗漏了文档中的内容,还是我必须手动编写高阶访问者? (这是我现在使用的解决方法。)

2 个答案:

答案 0 :(得分:9)

我同意在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#团队所知道的事情,但我不认为这是否真的是重要特征以及支持它的最佳方式。

答案 1 :(得分:0)

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

(声明记录不会创建任何相关的函数,但记录具有属性,因此像上面这样的小型lambda可以很容易地突出某些字段。)