【问题标题】:Shorthand for calling a method on an object in F#在 F# 中调用对象方法的简写
【发布时间】:2009-03-24 13:58:35
【问题描述】:

有没有办法“生成”这样的函数:

fun x -> x.ToString

我希望能够将实例方法转换为以“this”为参数的静态方法,如下所示:

items |> Seq.filter my_predicate |> Seq.map Object.ToString

【问题讨论】:

    标签: f#


    【解决方案1】:

    这已在 F# 集线器上讨论过多次。参见例如instance methods as functions。这是一个非常棘手的问题,所以据我所知,没有计划在 F# 的第一个版本中包含这样的东西,但最终有这样的东西会很棒:-)。

    您可以做的另一种解决方法是在 F# 中添加静态成员作为扩展方法:

    type System.Object with
      static member ObjToString(o:obj) = o.ToString()
    
    open System
    [ 1 .. 10 ] |> Seq.map Object.ObjToString;;
    

    但这有点难看。此外,这似乎仅在您为该方法使用不同名称时才有效。我猜 F# 不允许您使用扩展方法重载现有方法,并且总是更喜欢内部方法。

    【讨论】:

      【解决方案2】:

      我不知道我是否完全理解你,但对于这个具体的例子你可以写:

      items |> Seq.filter my_predicate |> Seq.map (fun x -> x.ToString)
      

      let f = fun x -> x.ToString
      items |> Seq.filter my_predicate |> Seq.map f
      

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        相关资源
        最近更新 更多