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
记录几点有价值的信息
把控制权让渡给语言/ 运行时
这一思路可以参考,早起c/c++需要手动去对垃圾资源进行清除和释放。但是到了java,它的虚拟机会自动帮助我们实现上述需求的自动化。从此解放程序员更多精力用于更高层、更有价值的业务代码的研究与编写。这就是将部分职责让渡给语言/运行时所带来好处的一个例子。同样当前很多语言已经引入函数式编程的语法,它们也就是把过去业务代码中繁琐的过滤、映射、遍历等代码变成语言的固有指令或者范式,程序员不需要再编写过滤等代码,只要研究过滤条件的把控。 我们业务代码中大量if 条件过滤,for 数据遍历,以及各种映射和转换代码,其实可以抽象为一个个函数指令如filter,map等。我们与其思考繁琐的细节,何不如考虑如何组合这一个个语义明确的指令来实现我们的业务。
抽象就是让开发者从繁琐重复的运作细节中抽离出来,去解答非重复性的问题
语言设计者实现出来的机制总是比开发者自己做的效率更高,因为它们不受语言本身的限制。所以应该使用语言者提供的接口。
切断多态与继承的耦合
语言范式与设计模式
函数式不追求复现结构之间的经典的耦合关系。它们定义各类型物件之间的态射(morphism)
概念
高阶函数
在数学和计算机科学中,高阶函数是
至少满足下列一个条件
的函数:闭包
柯里化
什么是柯里化
柯里化与部分施用的区别
它表示的是变换的过程
利用闭包的机制,一层层的返回单参数函数(参考上面的例子).而部分施用则是直接将具体值附着于函数某些参数上,减少调用函数所需要传入的参数个数。为什么需要柯里化
函数式编程思想看递归优越性
函数式编程思想之缓求值(推迟到必要才执行)
命令式编程思想与函数编程思想
程序是一系列改变状态的指令
sum = 0
sum+=i