我认为这与this question 有点相关。 ,但不确定,因为那里没有真正的答案,所以我去:
在 Scala 中,您可以编写如下代码:
aStringArray.map(_.toUpperCase())
这是以下的简写:
aStringArray.map(s => s.toUpperCase())
F# 中是否有类似的东西或实现它的方法(没有 ? 运算符或大量使用反射)?如果这不可能,这是否被视为 future 版本的语言功能? (我真的很冗长,只是为了在闭包中调用对象上的方法!)。
最佳答案
正如达里奥指出的那样,_.Foo()
之类的功能Scala 中的语法目前在 F# 中不可用,因此您必须使用 fun a -> a.Foo()
显式编写 lambda 函数。 .
据我所知,这样的问题在 F# 讨论中时不时出现,所以 F# 团队肯定考虑过。这有点棘手(例如,您是否只想允许成员使用或其他用途,例如 _ + 10
,lambda 表达式的范围是什么?)此外,与其他功能相比,该功能的值(value)相对较低可以做到的……总之有它就好了!
这可能也是为什么许多 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
type 没有与核心 F# 库中的所有功能对应的模块,因此您必须自己编写。
关于syntax - 在 lambda 中调用对象方法的 F# 简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3821178/