有关Scala占位符的问题

wei*_*idi 3 scala placeholder function-literal

请考虑Scala中的以下定义:

val f = ((_: Int) + 1).toString()
Run Code Online (Sandbox Code Playgroud)

代码为f指定函数文字_ + 1的字符串表示,这很自然,除了这不是我想要的.我打算定义一个接受int参数的函数,将其递增1,并返回其字符串格式.

要消除歧义,我必须编写一个带有显式参数的lambda表达式:

val g = (x: Int) => (x + 1).toString()
Run Code Online (Sandbox Code Playgroud)

那么我可以得出结论:占位符语法不适合复杂的函数文字吗?或者是否有一些规则说明函数文字的范围?似乎占位符不能嵌套在函数文字中的括号中(除了定义其类型所需的除外)

mis*_*tor 7

是的,你认为占位符语法除了简单的函数文字之外没有用处,你是对的.

对于它的价值,你提到的特殊情况可以用占位符语法和函数组合的结合来编写.

scala> val f = ((_: Int) + 1) andThen (_.toString)
f: Int => java.lang.String = <function1>

scala> f(34)
res14: java.lang.String = 35
Run Code Online (Sandbox Code Playgroud)

  • @weidi,`Function1 #compose`相当于Haskell中的`.`.然而,由于Scala的左向右流动类型推断,"Funtion1#andThen"更方便使用. (2认同)