代码之家  ›  专栏  ›  技术社区  ›  Nathan Shively-Sanders

F#高阶属性访问器

  •  3
  • Nathan Shively-Sanders  · 技术社区  · 14 年前

    我刚刚把我的原型元组升级到了一个记录。总有一天它会成为一个真正的班级。同时,我想翻译如下代码:

    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

    2 回复  |  直到 14 年前
        1
  •  9
  •   Ringil    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)
    

        2
  •  0
  •   Brian    14 年前
    examples |> Seq.map (fun e -> e.Description)
    

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