代码之家  ›  专栏  ›  技术社区  ›  em70

f对lambda中的对象调用方法的简写

  •  5
  • em70  · 技术社区  · 14 年前

    我认为这与 this question 但不确定,既然没有真正的答案,我来:
    在scala中,您可以编写以下代码:

    aStringArray.map(_.toUpperCase())

    以下简称:

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

    在f中是否有类似的东西或实现它的方法(没有?操作员还是大量使用反射?如果这不可能,这是否被视为未来版本的语言功能?(实际上,函数的冗长性只是为了在闭包中对对象调用一个方法!).

    4 回复  |  直到 14 年前
        1
  •  6
  •   Tomas Petricek    14 年前

    正如达里奥指出的那样 _.Foo() scala中的语法当前在f_中不可用,因此必须使用 fun a -> a.Foo() .

    据我所知,像这样的问题不时会出现在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 -> v.Add(10) Foo.add 10 创建函数值。不幸的是, String 类型没有与核心f库中的所有函数对应的模块,因此您必须自己编写它。

        2
  •  5
  •   Dario    14 年前

    只使用 fun s -> s.ToUpper() 作为参数,它创建了类似于scala的匿名函数。

    注意这个漂亮的 _ scala的技巧(目前)在f中不存在,但是如果您不调用对象方法,则可以像in一样使用部分计算。

    filter ((=) 42) list
    
        3
  •  1
  •   Brian    14 年前

    查看此论坛主题:

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

    F团队已经在这片领土上进行了多次,但没有任何可行的办法。在这一点上,我认为值得怀疑的是,我们将引入一种新的句法形式,这种形式可以节省不到10个字符。

        4
  •  -1
  •   Benjol    14 年前

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

    let toupper (s:string) = s.ToUpper()
    aStringArray.map toupper
    
    推荐文章