F#在lambda中调用对象方法的简写

em7*_*m70 6 syntax f# language-features

我认为这与这个问题有些相关,但是不确定,因为那里没有真正的答案,我
在这里: 在Scala中你可以编写如下代码:

aStringArray.map(_.toUpperCase())
Run Code Online (Sandbox Code Playgroud)

这是简写​​:

aStringArray.map(s => s.toUpperCase())
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*cek 7

正如Dario指出的那样,_.Foo()Scala中的语法之类的功能目前在F#中不可用,因此您必须使用显式编写lambda函数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)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用fun v -> v.Add(10)Foo.add 10创建一个函数值.不幸的是,该String类型没有与核心F#库中的所有函数相对应的模块,因此您必须自己编写它.


Dar*_*rio 5

只需使用fun s -> s.ToUpper()作为参数,它创建Scala所做的同类匿名函数.

请注意,_来自Scala的这个漂亮技巧(当前)并不存在于F#中,但如果您没有调用对象方法,则可以使用部分评估,例如

filter ((=) 42) list
Run Code Online (Sandbox Code Playgroud)