我认为这与这个问题有些关联,但不确定,因为那里没有真正的答案,所以我来这里提问:
在Scala中,您可以编写以下代码:
aStringArray.map(_.toUpperCase())
这是一个缩写,意思是:
aStringArray.map(s => s.toUpperCase())
在F#中是否有类似的东西或者一种实现方式(不使用?操作符或大量使用反射)?如果不可能,是否正在考虑将其作为未来版本的语言特性?(我真的很讨厌在闭包中调用对象上的方法时需要编写冗长的函数!)
我认为这与这个问题有些关联,但不确定,因为那里没有真正的答案,所以我来这里提问:
在Scala中,您可以编写以下代码:
aStringArray.map(_.toUpperCase())
这是一个缩写,意思是:
aStringArray.map(s => s.toUpperCase())
_.Foo()
语法的特性在F#中目前不可用,因此您将需要显式编写lambda函数,使用 fun a -> a.Foo()
。_ + 10
,并且lambda表达式的范围是什么?)另外,与其他可以完成的事情相比,该特性的价值相对较低...无论如何,拥有它是很好的!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#库中的函数,因此您需要自己编写。
只需使用 fun s -> s.ToUpper()
作为参数,这将创建与Scala相同类型的匿名函数。
请注意,来自Scala的巧妙的 _
技巧在F#中(目前)不存在,但如果您没有调用对象方法,您可以像下面这样使用部分求值:
filter ((=) 42) list
请查看此论坛帖子:
http://cs.hubfs.net/forums/permalink/13313/13319/ShowThread.aspx#13319
F#团队已经多次涉足这个领域,但是从来没有出现过可行的解决方案。目前,我认为引入一个新的语法形式,如果无法节省超过10个字符,那么它的可行性值得怀疑。这并不是你想要的答案,但目前我通过创建虚拟静态函数(如果我需要多次使用相同的内容)来解决这个问题,因为它比lambda语法更美观:
let toupper (s:string) = s.ToUpper()
aStringArray.map toupper
let toUpper (s:string) = s.ToUpper()
,或者直接使用匿名函数。 - Tomas Petricek
a.b
视为应用点运算符,则会更简单。那么.b
就是一种自然的语法。 - Muhammad Alkarouri