【问题标题】:Questions about placeholders in Scala关于 Scala 中占位符的问题
【发布时间】:2012-01-29 08:30:22
【问题描述】:

考虑 Scala 中的以下定义:

val f = ((_: Int) + 1).toString()

代码将函数字面量 _ + 1 的字符串表示分配给 f,这很自然,只是这不是我想要的。我打算定义一个接受 int 参数的函数,将其递增 1,并返回其字符串格式。

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

val g = (x: Int) => (x + 1).toString()

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

【问题讨论】:

    标签: scala placeholder function-literal


    【解决方案1】:

    是的,您认为占位符语法除了简单的函数字面量之外没有用处是正确的。

    不管怎样,你提到的特殊情况可以结合占位符语法和函数组合来编写。

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

    【讨论】:

    • 谢谢。然后也是我要找的。我曾期待类似于 Haskell 中的点运算符的东西,但什么也没找到。
    • @weidi, Function1#compose 相当于 Haskell 中的 .。但是由于 Scala 的从左到右的流动类型推断,Funtion1#andThen 使用起来更方便。
    【解决方案2】:

    似乎占位符不能嵌套在函数文字中的括号中(定义其类型所需的除外)

    这是正确的。请参阅 placeholder syntaxuse case example 的规则。

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多