Scala强调最小功能

cou*_*ech 23 scala anonymous-function

让我们为这个问题创建一个值:

val a = 1 :: Nil
Run Code Online (Sandbox Code Playgroud)

现在,我可以证明匿名函数可以用这样的简写形式编写:

a.map(_*2)
Run Code Online (Sandbox Code Playgroud)

是否有可能写出这个功能的简写?:

a.map((x) => x)
Run Code Online (Sandbox Code Playgroud)

我的解决方案不起作用:

a.map(_)
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 43

为了记录,a.map(_)不起作用,因为它代表x => a.map(x),而不是a.map(x => x).发生这种情况是因为单个_代替参数代表部分应用的功能.在这种情况下2*_,它代表一个匿名函数.这两种用途非常接近,很容易让他们感到困惑.


Kev*_*ght 24

您的第一个速记表也可以无点编写

a map (2*)
Run Code Online (Sandbox Code Playgroud)

感谢乘法是可交换的.

至于(x) => x,你想要这个identity功能.这在Predef中定义并且是通用的,因此您可以确定它是类型安全的.

  • @Rex`identity`可能是8个字母,但它仍然是一个单一的标识符,所以更容易解析(对于人类和编译器都一样) (9认同)
  • 我认为你的意思是可交换的. (3认同)
  • 遗憾的是,`x => x`是四个字符,而`identity`是八个字符.这就是我从不使用`身份'的原因. (2认同)

mis*_*tor 17

您应该使用identity此用例的函数.

a.map(identity)
Run Code Online (Sandbox Code Playgroud)

identityscala.Predef中定义为:

implicit def identity[A](x: A): A = x 
Run Code Online (Sandbox Code Playgroud)