zoukankan      html  css  js  c++  java
  • scala函数式编程&柯里化&偏函数

    函数式:实现了某个特质的对象,有22个function

    编程语言的范式:

        命令式:面向过程、面向对象

        函数式:hashkey,scala

    lambda函数

    object ObjectDemo {
       def main(args: Array[String]): Unit = {
         //println(sum(4,8))
         
         //println(Fsum(3,9))
         
         val sum = new Function2[Int,Int,Int](){
           def apply(x:Int, y:Int):Int = {
             x+y
           }
         }
         println(sum.apply(9, 8));
         
    //     val MyFun = new SumFunction
    //     println(MyFun.func(22, 11))
         
         val MyFun = new MyFunction2[Int, Int, Int]{
           def func(x:Int, y:Int):Int={
             x + y
           }
         }
         //println(MyFun.func(3, 7))
         
         //testFunction1(Fsum);
         testFunction2((x, y) => x * y);
       }
    
       def testFunction1(f : MyFunction2[Int,Int,Int]):Unit = {
         val a = 33
         val b = 55
         println(f.func(a, b));
       }
    
        def testFunction2(f : Function2[Int,Int,Int]):Unit = {
         val a = 3
         val b = 9
         println(f(a, b));
       }
       
       //方法
       def sum(x:Int, y:Int):Int={
         x + y
       }
    
       //函数-----是一个Lambda表达式,它背后有就一个函数式接口
       val Fsum = (x:Int, y:Int)=> x + y
    }
    
    trait MyFunction2[X, Y, Z]{
      def func(a:X, b:Y):Z 
    }
    
    class SumFunction extends MyFunction2[Int, Int, Int]{
       def func(x:Int, y:Int):Int={
         x + y
       }
    }

    柯里化

    class CurryDemo {
      //定义高阶函数
    	def func2(op:(Int,Int) => Int, a:Int, b:Int):Int={
    	  op(a,b)
    	}
      def func1(op:Function2[Int,Int,Int], a:Int, b:Int):Int = op(a,b)
    
     // println(func1((x,y)=>x*y, 3, 4))
      
      
      def func3(op:(Int, Int) => Int, a:Int, b:Int):(Int,Int)=>Int ={
        op
      }
      
      val f9 = func3((x,y)=>x*y,4,6)
      //println(f.toString())
      //println(f9(4,9))
    
    	//调用高阶函数
    	val f = func3(add,1,2)
    	//println(f(6, 9))
    	
    	//调用函数
    	def add(a:Int,b:Int) = a + b
    	
    	//柯里化----------逻辑数学----- 这个世界基本的组成元素就是 a=>a
    	def plusBy1(factor:Int) = (x:Int) => x + factor
    	def plusBy(factor:Int) = {
    	   (x:Int) => x + factor
    	}
    	
    	val f1 = plusBy(3)
    	println(f1(5))
    	
    	val r1 = plusBy(3)(5)
    	println(r1)
    //	
      def add2(a:Int) = (b:Int) => a + b
      println(add2(3)(4))
    
    }
    
    object CurryDemo{
      def main(args: Array[String]): Unit = {
        new CurryDemo
      }
    }

    偏函数

    //偏函数 ------- Partial Function
    
    object PartialFunctionDemo2 {
      def main(args: Array[String]): Unit = {
        val signal:PartialFunction[Int,Int] = {
          case x if x > 0 => 1
          case x if x < 0 => -1
        }
        if(signal.isDefinedAt(0) == true){
           println(signal(0))
        }
        
        val compose_signal:PartialFunction[Int,Int] = signal.orElse{
          case 0 => 0
        }
        
        println(compose_signal(6))
        //println(signal(0))
        
        val new_signal:Function[Int,Int] = signal.compose{
          case x => x - 1
        }
        println(signal(4))
        println(new_signal(4))
        
        
      }
    }

    偏应用函数

    //偏应用函数  Partial applied Function---------- 科里化是偏应用函数的特殊形式
    
    object PartialApplyFunctionDemo {
      def main(args: Array[String]): Unit = {
        def add(x:Int,y:Int,z:Int) = x+y+z
    
        def addX = add(1,_:Int,_:Int) // x 已知
        println(addX(2,3))
    
        def addXAndY = add(10,100,_:Int) // x 和 y 已知
        println(addXAndY(1))
        
        def addZ = add(_:Int,_:Int,10) // z 已知
        println(addZ(1,2))
        
        //def fadd = add(_:Int, _:Int, _:Int)
        def fadd = add _
        
        val f3= fadd(1,2,_:Int)
        println(f3(3))
      }
    }
  • 相关阅读:
    Singleton 单例模式 泛型 窗体控制
    SpringMVC异常处理注解@ExceptionHandler
    如何实现beanutils.copyProperties不复制某些字段
    Spring 注解学习笔记
    使用客户端SVN在Update时遇到Previous operation has not finished; run 'cleanup' if it was interrupted,需要cheanup文件夹,解决方式
    jQuery的选择器中的通配符
    mysql str_to_date字符串转换为日期
    Mybatis中mapper.xml文件判断语句中的单双引号问题
    Jquery中each的三种遍历方法
    Javascript 中动态添加 对象属性
  • 原文地址:https://www.cnblogs.com/apppointint/p/8885292.html
Copyright © 2011-2022 走看看