2010-06-07 42 views
2

我刚将原型组元升级到记录。有一天它可能会成为一个真正的阶级。在此期间,我想这样的转换代码:F#高阶属性访问器

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 

的问题是,我希望得到一个功能Description : Example -> string当我宣布实例记录,但我不“T。我探讨了一些并尝试过类的属性,但这也不起作用。我是否在文档中遗漏了某些内容,或者是否需要手动编写高阶访问器? (这是我现在使用的解决方法。)

回答

8

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

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

(声明一个记录不产生任何关联的功能,但是记录有属性,所以像上面一个微小的拉姆达可以轻松投射出的某些字段。 )

+0

嗯,这是我在谈论的解决方法。在呼叫站点编写高阶访问器是冗长的,并且在记录声明之后写入它很容易忘记。 – 2010-06-07 20:56:34

+0

好的(“高阶访问器”在这里是一个奇怪的标签; lambda不是高阶的)。是的,如果有“fun x - > x”的简写语法,那将会很不错。因为这是一个常见的习惯用法。 – Brian 2010-06-07 20:59:31

+0

是的,在短时间内我想不出一个更好的名字。 – 2010-06-07 21:10:07