ditunes / blog

write my idea & share my tunes
1 stars 1 forks source link

函数式编程小记 #7

Open ditunes opened 8 years ago

ditunes commented 8 years ago

记录几点有价值的信息

把控制权让渡给语言/ 运行时

这一思路可以参考,早起c/c++需要手动去对垃圾资源进行清除和释放。但是到了java,它的虚拟机会自动帮助我们实现上述需求的自动化。从此解放程序员更多精力用于更高层、更有价值的业务代码的研究与编写。这就是将部分职责让渡给语言/运行时所带来好处的一个例子。同样当前很多语言已经引入函数式编程的语法,它们也就是把过去业务代码中繁琐的过滤、映射、遍历等代码变成语言的固有指令或者范式,程序员不需要再编写过滤等代码,只要研究过滤条件的把控。 我们业务代码中大量if 条件过滤,for 数据遍历,以及各种映射和转换代码,其实可以抽象为一个个函数指令如filter,map等。我们与其思考繁琐的细节,何不如考虑如何组合这一个个语义明确的指令来实现我们的业务。

函数式不追求复现结构之间的经典的耦合关系。它们定义各类型物件之间的态射(morphism)


概念

高阶函数

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

function makecount(){
    var count = 0 ;
    return function(num){
        return count+=num;
    }
}

makecount()(3);//3
makecount()(4);//4
  function multiple(a,b,c){
      return a*b*c
  }
//after curry 

  function multipleForContains2(b){
        return function(c){
            return 2*b*c
        }
    }

// when  we need 2*3*4 then we should do in general 

multiple(2,3,4)

// when  we need 2*3*4 then we should do in curry

multipleForContains2(3)(4)
柯里化与部分施用的区别
    function mutiple(a,b,c){
        return a*b*c
    }

    // curry 柯里化
    function multipleForContains2(b){
        return function(c){
            return multiple(2,b,c);
        }
    }

   //partial function 部分施用
   function multipleForHas2(b,c){
        return multiple(2,b,c)
    }

  // use curry 
    multipleForContains2(3)(4) //2*3*4
  // use partial
    multipleForHas2(3,4)//2*3*4

why-curry-helps why-not-curry


函数式编程思想看递归优越性

stringStream.filter((str)->{return str.equals("3")}).firstMatch();

命令式编程思想与函数编程思想

命令式编程思想 函数编程思想
告知计算机怎么去做 告诉计算机我想要什么
程序是一系列改变状态的指令 将程序描述为表达式和转换,以数学方程建模并避免可变的状态

程序是一系列改变状态的指令

    List list = Lists.newArrayList(1,2,3,4,5)
    int sum = 0;
    for(int i : list){
        if(i > 2){
            sum+=i
        }
    }