函数式编程的第一个理念:函数是头等值,与整形,字符串的地位是一样的。
因此,函数可以像变量一样,传给函数,也可以作为返回值从函数中返回。同时,也可以保存在变量里。
例如,在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*),这样在内部可以将各种逻辑都看成类和对象来处理。统一对象和函数式编程的二重性
浙公网安备 33010602011771号