【问题标题】:What is a function literal in Scala?Scala 中的函数字面量是什么?
【发布时间】:2011-03-09 03:59:03
【问题描述】:

什么是 Scala 中的函数字面量,我应该什么时候使用它们?

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    函数字面量是定义函数的另一种语法。当您想将函数作为参数传递给方法(尤其是像折叠或过滤操作这样的高阶方法)但又不想定义单独的函数时,它很有用。函数字面量是匿名的——默认情况下它们没有名称,但您可以通过将它们绑定到变量来给它们命名。函数字面量定义如下:

    (a:Int, b:Int) => a + b
    

    您可以将它们绑定到变量:

    val add = (a:Int, b:Int) => a + b
    add(1, 2) // Result is 3
    

    就像我之前说的,函数字面量对于作为参数传递给高阶函数很有用。它们对于定义嵌套在其他函数中的单行或辅助函数也很有用。

    A Tour of Scala 为函数文字提供了很好的参考(他们称它们为匿名函数)。

    【讨论】:

    • 我认为指出函数文字如何只是 FunctionN 的糖可能很有用——这将为文字与“长”版本提供一个普遍的好案例。另外,虽然我有 +1,但它通常不是“用于定义函数的替代语法 [您的意思是方法吗????]”,因为 函数不是方法 -- 方法是适用于可以分派给它们(类)的类和消息的构造。 函数是“一等值”(支持apply和其他一些的对象)。
    • def add = (a:Int, b:Int) => a + b 不一样吗?我也可以使用这个“添加”来传递给另一个函数
    • 您还可以使用下划线运算符从现有函数创建函数字面量:def addTwoNumbers(a: Int, b: Int) = a + b; def add2 = addTwoNumbers _
    • 函数可以作为参数传递,但方法不能。
    【解决方案2】:

    将函数文字与 Scala 中的其他类型的文字进行比较可能很有用。 Literals 是一种符号糖,用于表示该语言认为特别重要的某些类型的值Scala has 整数字面量、字符字面量、字符串字面量等。Scala 将函数视为源代码中可由函数字面量表示的第一类值。这些函数值位于一个特殊的function type 中。例如,

    • 5 是一个整数文字,表示 Int 类型中的值
    • 'a' 是一个字符文字,表示Char 类型中的值
    • (x: Int) => x + 2 是一个函数字面量,表示 Int => Int 函数类型中的值

    字面量通常用作匿名值,也就是说,不首先将它们绑定到命名变量。这有助于使程序更简洁,并且适用于不意味着可重用的文字。例如:

    List(1,2,3).filter((x: Int) => x > 2)
    

    对比

    val one: Int = 1
    val two: Int = 2
    val three: Int = 3
    val greaterThan2: Int => Boolean = (x: Int) => x > two
    List(one,two,three).filter(greaterThan2)
    

    【讨论】:

    • 有没有办法让类型更明确?这行得通:List(1,2,3).map(x => x + 10) 这行不通:List(1,2,3).map((x: Int) : Str => x.toString) 这行得通,但不是那么明确:List(1,2,3).map((x: Int) => x.toString) 或者如果我想这样做,我应该使用命名函数?
    • @monteiro List(1,2,3).map((x: Int) => { x.toString }: String)
    【解决方案3】:

    Scala 编程,第三版

    8.3 一级函数

    一个函数字面量被编译成一个类,在运行时实例化时是一个函数值。[2]因此,函数字面量和值之间的区别在于,函数字面量存在于源代码中,而函数值在运行时作为对象存在。区别很像类(源代码)和对象(运行时)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多