资讯专栏INFORMATION COLUMN

对比scala,用javascript实现curried方法

tracymac7 / 848人阅读

摘要:从语法上提供了方法,如在函数式和面向对象以及两者的结合上都比走的更远,而且语法上相当的精简。但是也太灵活了,很多特性都和模拟出来。用对方法的实现代码链接在中使用函数定义,和将匿名函数赋值给变量基本上没有什么区别

scala从语法上提供了curried方法,如:

def add(x: Int, y: Int, z: Int) = x + y + z
val addCurried = (add _).curried
add(1, 2, 3) // => 6
addCurried(1)(2)(3) // => 6

val add2 = (x: Int, y: Int, z: Int) => x + y + z
val addCurried2 = add.curried
add(1, 2, 3) // => 6
addCurried(1)(2)(3) // => 6

scala 在函数式和面向对象以及两者的结合上都比javascript走的更远,而且语法上相当的精简。
但是js也太灵活了,很多特性都和模拟出来。

用javascript 对 curried 方法的实现:
代码链接:https://github.com/peichao01/test2/tree/master/javascript/curried

Function.prototype.curried = function(argsLength){
     var self = this, len = argsLength === undefined ? self.length : argsLength;
     if(len > 0){
          function curried (time, stack){
               return function(x){
                    stack[time] = x;
                    if(stack.length < len) {
                         return curried(time + 1, stack.concat());
                    } else {
                         return self.apply(self, stack);
                    }
               }
          }
          return curried(0, []);
     }
     else{
          return function(){
               return self.apply(self);
          }
     }
};

var adder = function(x, y, z){ // 在 javascript 中使用函数定义,和将匿名函数赋值给变量基本上没有什么区别
    return x + y + z
}
var t = function(){}
var p = function (a) {
     return a + 1
}

// var a = adder.curried();
// var a1 = a(1)(2)(3);

var aa = adder.curried();
var aa1 = aa(1);
var aa2 = aa1(2);
var aa3 = aa2(3);
console.log(aa3);
console.log(aa1(-10)(23));

var ab2 = aa1(5);
var ab3 = ab2(6);
console.log(ab3);

console.log(aa(3)(5)(10));
console.log(aa(25)(50)(12));
console.log(aa1(-10)(23));

var t1 = t.curried();

var p1 = p.curried();
var p2 = p1(2);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78053.html

相关文章

  • SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    摘要:函数式编程,一看这个词,简直就是学院派的典范。所以这期周刊,我们就重点引入的函数式编程,浅入浅出,一窥函数式编程的思想,可能让你对编程语言的理解更加融会贯通一些。但从根本上来说,函数式编程就是关于如使用通用的可复用函数进行组合编程。 showImg(https://segmentfault.com/img/bVGQuc); 函数式编程(Functional Programming),一...

    csRyan 评论0 收藏0
  • JavaScript也玩私人订制——玩转函数柯里化

    摘要:而柯里化是一个属于函数式编程的一个常见的技巧。简单来说,函数柯里化就是对高阶函数的降阶处理。让你意外的是,这就是柯里化的基本思想,简单地让人猝不及防。 函数式编程是一种被部分JavaScript程序员推崇的编程风格,更别说 Haskell 和 Scala 这种以函数式为教义的语言。原因是因为其能用较短的代码实现功能,如果掌握得当,能达到代码文档化(代码本身具有很高可读性甚至可以代替文档...

    MRZYD 评论0 收藏0
  • 函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数

    摘要:函数式编程与面向对象编程表达式函数柯里化高阶函数之剑什么是表达式例子定义表达式是一个匿名函数,表达式基于数学中的演算得名,直接对应于其中的抽象,是一个匿名函数,即没有函数名的函数。 函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数.md 之剑 2016.5.2 11:19:09 什么是lambda表达式 例子 For example, in Lisp the...

    张金宝 评论0 收藏0
  • 对比scalajavascript实现 特质(trait) 的部分特性

    摘要:特质是的一个重要的特性,主要的使用方式有两个方面拓宽瘦接口为胖接口。定义可堆叠的改变。相对于多重继承而言最灵活的一方面就是所指定的对象只有到被混入之后才能确定。 特质(trait)是scala的一个重要的特性,主要的使用方式有两个方面:1.拓宽瘦接口为胖接口。2.定义可堆叠的改变。 trait相对于多重继承而言最灵活的一方面就是super所指定的对象只有到被混入之后才能确定。 因为特质...

    cocopeak 评论0 收藏0
  • vavr:让你像写Scala一样写Java

    摘要:是在尝试让拥有跟类似的语法。在中使用,需要显示得将集合转成的步骤,而在中则免去了这样的步骤。中的语句只能针对常量起作用,而使用模式匹配则可以对另一个函数的返回结果起作用,功能非常抢到。 Hystrix是Netflix开源的限流、熔断降级组件,去年发现Hystrix已经不再更新了,而在github主页上将我引导到了另一个替代项目——resilience4j,这个项目是基于Java 8开发...

    andycall 评论0 收藏0

发表评论

0条评论

tracymac7

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<