scala的高阶函数

  • 头等函数,函数是一个值
实现fn求和
package com.jn.scala.scalalearn

/**
* Created by admin on 2016/1/7.
*/
object FunctionTest {
  
//fn = n
  
def sum1(a: Int, b: Int): Int = {
    
if (a > b) else a + sum1(a + 1, b)
  }

  
//fn = 2n
  
def sum2(a: Int, b: Int): Int = {
    
if (a > b) else * a + sum2(a + 1 , b)
  }

  
//  将fn进行抽象,改进 
  
def f1(a: Int) = a;

  
def f2(a: Int) = * a

  
//fn = n
  
def sum11(a: Int, b: Int): Int = {
    
if (a > b) else f1(a) + sum11(a + 1, b) 
  }

  
//fn = 2n
  
def sum22(a: Int, b: Int): Int = {
    
if (a > b) else f2(a) + sum22(a + 1, b) 
  }

  
//通过上面减少写fn可能出错的过程,但是需要定义多个函数f1,f2 
  //  再次改进
  
def sum(f: Int => Int, a: Int, b: Int): Int = {
    
if (a > b) else f(a) + sum(f, a + 1, b)
  }

  
def f11(a: Int) = a;

  
def f22(a: Int) = * a

  
//fn = n
  
def sum111(a: Int, b: Int): Int = sum( f11, a, b)

  
//fn = 2n
  
def sum222(a: Int, b: Int): Int = sum( f22, a, b)

  
//  总结:函数作为参数进行传递,函数能调用满足参数要求的不同函数作为参数 
  //  f11,f22都是函数可以被调用。

  //  匿名函数
  //  匿名函数的作用域很小,往往只在参数使用,作用范围就是调用该函数的函数体 
  //  函数可以赋值给变量
  
val f111 = (a: Int) => a
  
val f222 = (a: Int) => * a 
  
val f333 = (a: Int) => * a 

  
//  定义函数mul(a:Int)这个函数没有返回类型,等号右边是匿名函数,这可以知道,用函数生成函数 
  
def mul(a: Int) = (b: Int) => b * a

  
val f1111 mul(1 )
  
val f2222 mul(2 )
  
val f3333 mul(3 )

  
//输入参数为f:Int => Int 
  //  返回值为(Int,Int) => Int的函数
  //  Int={表示匿名函数的真实内容
  
def sum4(f: Int => Int): (Int, Int) => Int = {
    
def sum5(a: Int, b: Int): Int = if (a > b) else f(a) + sum5(a + 1, b) 
    sum5
  }

  
def sum44(f: Int => Int): (Int, Int) => Int = {
    
def sum55(a: Int, b: Int): Int = sum (f, a, b);
    sum55
  }

  
val f41 sum4( f1111)
  
val f42 sum4( f2222)
  
val f43 sum4( f3333)

  
val f441 sum44( f1111)
  
val f442 sum44( f2222)
  
val f443 sum44( f3333)
//柯里化:指将接受两个参数的函数变成新的接收一个参数的函数过程 
//  调用一次函数,传入两个参数
def mul2(a:Int,b:Int) =a*b
  
//  mul2:(Int,Int) =>Int
    //柯里化定义
  
def mul22(a:Int)(b:Int) =a*b
//解释,用下面的借代 
//  def first(a:Int)=(b:Int) =>a*b
//  def second = first(a)
//  second:(Int) =>Int

//柯里化可以对多个参数进行柯里化
//  def A(a:T1,b:T2,c:T3,D:T4) =E
//  def A(a:T1)(b:T2)(c:T3)(D:T4) =E

//  对于前面的求和进行柯里化
def sum5(f:Int=>Int)(a:Int,b:Int):Int = {
  
if (a>b) else f(a) + sum5(f)(a+ 1,b)
}
  
def f51(a: Int) = a
  
def f52(a: Int) = * a
  
val f551 sum5(f51)( 1, 5
  
val f552 sum5(f52)( 1, 5

  
val f6 sum5(f2)_ 


  
def main(args: Array[String ]) {
    
//  mul2:(Int,Int) =>Int 
    
println( sum1( 15))

    
println( sum2(
1 5 ))

    
println( sum11(
1 5 ))

    
println( sum22(
1 5 ))

    
println( sum111(
1 5 ))

    
println( sum222(
1 5 ))

    
println(
 f41( 15))
    
println(
 f42( 15))
    
println(
 f43( 15))

    
println(
 f441( 15))
    
println(
 f442( 15))
    
println(
 f443( 15))
//    柯里化 
    
println( mul2( 2, 5))
    
println( mul22(
2 )(5 ))

    
println(
 f551)
    
println(
 f552)
    
println(
 f6)
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值