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

标签 syntax f# language-features

我认为这与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/

相关文章:

C# 字典初始化程序编译不一致

php - 使用 'standalone parentheses'

c# - 返回子类而不是父类(super class) F#

f# - F# 中警告 "This construct causes code to be less generic than indicated by the type annotations"是什么意思

c++ - 更自然的 boost::bind 替代方案?

c++ - C++中的错误检查

f# - 对行求和的更好方法

c# - 我应该使用 Guid 和 Guid.Empty 还是可以为 null 的 Guid?

c# - 为什么 C# 不实现索引属性?

.net - .NET 中类加载器的等效项