【问题标题】:F# shorthand to call method on object in lambda在 lambda 中调用对象方法的 F# 简写
【发布时间】:2011-04-18 18:46:56
【问题描述】:

我认为这与this question 有点相关,但不确定,因为那里没有真正的答案,所以我开始:
在 Scala 中,您可以编写如下代码:

aStringArray.map(_.toUpperCase())

简写为:

aStringArray.map(s => s.toUpperCase())

在 F# 中是否有类似的东西或实现它的方法(没有 ? 运算符或大量使用反射)?如果这不可能,这是否被视为未来版本的语言功能? (我真的很冗长,只是为了在闭包中调用对象上的方法!)。

【问题讨论】:

    标签: syntax f# language-features


    【解决方案1】:

    这并不是您真正想要的答案,但目前我通过创建虚拟静态函数来解决这个问题(如果我需要多次使用相同的东西),因为它比 lambda 语法更漂亮:

    let toupper (s:string) = s.ToUpper()
    aStringArray.map toupper
    

    【讨论】:

    • ...或者let toUpper (s:string) = s.ToUpper(),如果你想定义一个命名函数。
    • @Tomas,是的,这就是我的目标,忘记了类型定义。
    【解决方案2】:

    查看此论坛主题:

    http://cs.hubfs.net/forums/permalink/13313/13319/ShowThread.aspx#13319

    F# 团队已经多次越过这个领域,但没有任何可行的结果。在这一点上,我认为我们是否会引入一种节省不到 10 个字符的新句法形式。

    【讨论】:

    • 它的字符数很少,但在概念上使它更容易,至少对我来说是这样。当然,如果将a.b 视为应用点运算符会更简单。那么.b 将是一种自然语法。
    • 除了在字符方面的保存之外,考虑到在使用经典 Oo 库时这段代码出现的频率无论如何都会很大,还有另一个巨大的优势:它读起来更好。
    【解决方案3】:

    正如 Dario 指出的,像 Scala 中的 _.Foo() 语法这样的功能目前在 F# 中不可用,因此您必须显式地使用 fun a -> a.Foo() 编写 lambda 函数。

    据我所知,这样的问题在 F# 讨论中时不时出现,所以 F# 团队肯定考虑过。这有点棘手(例如,您是否只想允许成员使用或其他用途,例如_ + 10,lambda 表达式的范围是什么?)此外,与其他功能相比,该功能的价值相对较低可以做到的……总之有它就好了!

    这可能也是许多 F# 类型将操作公开为成员(可用于 OO 样式)和模块中的函数(用于函数样式)的原因。我认为您可以将其视为一种良好的 F# 实践(但这取决于您的设计偏好)。例如:

    type Foo(a:int) = 
      member x.Add(b:int) = a + b
    
    // Attribute allows you to define module with the same name
    [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
    module Foo = 
      let add b (v:Foo) = v.Add(b)
    

    然后您可以同时使用fun v -&gt; v.Add(10)Foo.add 10 来创建函数值。不幸的是,String 类型没有与核心 F# 库中的所有功能对应的模块,因此您必须自己编写它。

    【讨论】:

      【解决方案4】:

      只需使用fun s -&gt; s.ToUpper() 作为参数,它会创建与Scala 相同的匿名函数。

      请注意,来自 Scala 的这个漂亮的 _ 技巧(当前)不存在于 F# 中,但如果您不调用对象方法,则可以像 in 中那样使用部分求值

      filter ((=) 42) list
      

      【讨论】:

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