函数式编程的第一个理念:函数是头等值,与整形,字符串的地位是一样的。

因此,函数可以像变量一样,传给函数,也可以作为返回值从函数中返回。同时,也可以保存在变量里。

例如,在receive中应该就是,将一个偏函数,作为返回值,返回给了receive。

 

函数式编程的第二个理念:程序的操作应该是将输入值映射成输出值,而不是就地改变数据。

可以解释为函数应该是无副作用的,函数与周围环境的交互,只是参数和返回值。(指称透明,可以用他的结果替换函数调用,而不影响语意)

 

scala中不强迫使用函数式风格,但是对应可变数据和有副作用的函数调用,scala有更好的函数是编程方法代替他。

 

Function:

在scala内部,函数其实是某些特质的集合,通过apply()语法,可以让你调用对象,就像是在调用函数。

具体说来:具有一个参数的函数,其实是Function1特质的实例。

scala> object addOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined module addOne

scala> addOne(1)
res2: Int = 2

这个Function特质集合下标从1到22.可以看出使用apply()方法,有助于统一对象和函数式编程的二重性。

你可传递类,把他们当作函数使用,而函数本质就是类的实例。

要注意:在类中定义的def,是方法,并不是函数。在外面独立定义的才是函数,是Function*特质的实例。

类也可以扩展Function,这些类的实例可以使用()调用。

scala> class AddOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined class AddOne

scala> val plusOne = new AddOne()
plusOne: AddOne = <function1>

scala> plusOne(1)
res0: Int = 2

可以使用更直观快捷的extends (Int => Int)代替extends Function1[Int, Int]

class AddOne extends (Int => Int) {
  def apply(m: Int): Int = m + 1
}

这里想要强调的是函数其实就是类的实例(Function*),这样在内部可以将各种逻辑都看成类和对象来处理。统一对象和函数式编程的二重性