柯里化

柯里化面试题

若如初见. 提交于 2019-12-28 03:52:37
//定义一个数组专门存储所有的参数 var _args = Array.prototype.slice.call(arguments); //在 内部声明一个函数,利用闭包的特性保存_args并收集所有的参值 var _adder = function () { _args.push(...arguments); return _adder; } //利用toStringy隐式转换的特性,当最后执行隐式转换,并计算最终的值返回 _adder.toString=function(){ return _args.reduce(function(a,b){ return a+b; }) } return _adder; } console.log(add(1)(2)(3)) add(1)(2)(3) // 6 add(1, 2, 3)(4) // 10 add(1)(2)(3)(4)(5) // 15 add(2, 6)(1) // 9 来源: CSDN 作者: @呵呵 链接: https://blog.csdn.net/weixin_41639609/article/details/103732915

函数柯里化

非 Y 不嫁゛ 提交于 2019-12-26 20:12:44
柯里化的好处是可以将多个参数的函数,先传部分参数调用得到一个缓存的函数,避免了重复模板。(利用闭包进行参数缓存,递归的收集参数),如下是一个简单的柯里化实现。具体使用柯里化可以使用loash,curry 工具函数 可以实现无限的参数收集调用 function curry(fn) { if (typeof fn != "function") { return; } var length = fn.length; function save(){ var arg = Array.prototype.splice.call(arguments,0,arguments.length); if(arg.length==length){ return fn.apply(null,arg) } else { return function (){ var args = Array.prototype.splice.call(arguments,0,arguments.length); return save.apply(null,arg.concat(args)); }; } } return save; } var add1 = curry(function(a,b,c,d,e,f){ return a+b+c+d+e+f; }) console.log(add1(1,2,3,4,5,6));

浅析 JavaScript 中的 函数 uncurrying 反柯里化

穿精又带淫゛_ 提交于 2019-12-23 17:18:05
柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。 因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程。 请见我的另一篇博客· 浅析 JavaScript 中的 函数 currying 柯里化 反柯里化 相反,反柯里化的作用在与扩大函数的适用性,使本来作为特定对象所拥有的功能的函数可以被任意对象所用. 即把如下给定的函数签名, obj.func(arg1, arg2) 转化成一个函数形式,签名如下: func(obj, arg1, arg2) 这就是 反柯里化的形式化描述。 当然是有个前提的,函数 y 需要语言上支持鸭子类型, 引自维基 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。...在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法... 例如,下面的一个简单实现: Function.prototype.uncurrying = function() { var that = this; return function() { return Function.prototype.call.apply(that, arguments); } }; function sayHi () {

javascript函数柯里化及应用

送分小仙女□ 提交于 2019-12-18 07:06:16
柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数。下面可以通过例子来帮助理解。 function adder(num) { return function(x) { return num + x; } } var add5 = adder(5); var add6 = adder(6); print(add5(1)); // 6 print(add6(1)); //7 函数adder接受一个参数,并返回一个函数,这个返回的函数可以像预期那样被调用。变量add5保存着adder(5)返回的函数,这个函数可以接受一个参数,并返回参数与5的和。柯里化在 DOM 的回调中非常有用。 函数柯里化的主要功能是提供了强大的动态函数创建方法,通过调用另一个函数并为它传入要柯里化(currying)的函数和必要的参数而得到。通俗点说就是利用已有的函数,再创建一个动态的函数,该动态函数内部还是通过已有的函数来发生作用,只是传入更多的参数来简化函数的参数方面的调用。 function curry(fn) { var args = [].slice.call(arguments, 1); return function() { return fn.apply(null, args.concat([].slice.call(arguments, 0

Scala基础

别来无恙 提交于 2019-12-09 23:20:57
1. 介绍 柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。 在Scala中方法和函数有细微的差别,通常编译器会自动完成方法到函数的转换。如果想了解Scala方法和函数的具体区别,请参考博文 Scala基础 - 函数和方法的区别 。 2. Scala中柯里化的形式 Scala中柯里化方法的定义形式和普通方法类似,区别在于柯里化方法拥有多组参数列表,每组参数用圆括号括起来,例如: def multiply(x: Int)(y: Int): Int = x * y multiply方法拥有两组参数,分别是(x: Int)和(y: Int)。 multiply方法对应的柯里化函数类型是: Int => Int => Int 柯里化函数的类型声明是右结合的,即上面的类型等价于: Int => (Int => Int) 表明该函数若只接受一个Int参数,则返回一个Int => Int类型的函数,这也和柯里化的过程相吻合。 3. 探究柯里化函数 我们仍以上面定义的multiply方法为例探索柯里化的一些细节: def multiply(x: Int)(y: Int): Int = x * y 上面的代码定义了一个柯里化方法

Scala基础

一个人想着一个人 提交于 2019-12-09 20:45:22
1. 函数和方法 在Scala中函数是一等公民,你可以像操作数字一样将函数赋值给一个变量。使用val语句可以定义函数,def语句定义方法: class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 } 在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数: val f1 = m _ 在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译器需要将方法转换成函数: val f1: (Int) => Int = m 通常情况下编译器会自动将方法转换成函数,例如在一个应该传入函数参数的地方传入了一个方法,编译器会自动将传入的方法转换成函数。 2. 两者的区别 可以直接调用函数上的方法,而方法却不行,例如: f.toString //编译通过 m.toString //编译失败 3. Currying函数和Currying方法 Currying函数可以只传入部分参数返回一个偏函数(partially applied function, 也叫部分应用函数),而Currying方法在转换成偏函数时需要加上显式说明,让编译器完成转换: object TestCurrying { def invoke(f: Int => Int =>

柯里化函数

若如初见. 提交于 2019-12-05 06:49:29
柯里化:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术; //函数定义 function add(x,y){ return x + y; } //函数调用 add(3,5);//8 //函数表达式 var add = function(x){ return function(y){ return x + y; } }; //函数调用 add(3)(5); bind方法就是该技术在js中的实践。 来源: https://www.cnblogs.com/zhouqiaoyun/p/11911586.html

函数柯里化(Currying)小实践

≡放荡痞女 提交于 2019-12-04 15:18:23
什么是函数柯里化 在计算机科学中,柯里化(Currying)是把 接受多个参数的函数变换成接受一个单一参数 (最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。 举个例子,假设程序员A是个妻管严,工资悉数上交给妻子,为了买一个心爱的键盘 程序员A每天都偷偷藏几毛钱,打算年底买个键盘,因此程序员A写了以下这个方法用来统计年终一共凑了多少钱,方法如下: /** * @description 统计金额 * @return {number} */ function countMoney() { let money = 0 // 温馨提示:arguments是所接收的所有参数组成的类数组,不懂的需要搜一搜补补知识啦 for (let i = 0; i < arguments.length; i++) { money += arguments[i] } return money } // 藏了一年的账本记录的数据 const records = [1, 1, 2, 2, 3, 3, 4, 4] // 把全部数据都输入进行计算 countMoney(1, 1, 2, 2, 3, 3,

Scala中的函数高级使用

拜拜、爱过 提交于 2019-12-04 12:08:32
1.偏函数 1.基本介绍 在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择 将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数实施计算,超出范围的值会忽略(未必会忽略,这取决于你打算怎样处理) 偏函数在Scala中是一个特质PartialFunction 2.快速入门 给定集合val list = List(1, 2, 3, 4, "abc") ,要求将集合list中的所有数字+1,并返回一个新的集合,要求忽略掉非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5) 方式1:使用map和filter object exercise_002 { def main(args: Array[String]): Unit = { val list = List(1, 2, 3, 4, "abc") //思路1,使用map+fliter的思路 def f1(n:Any): Boolean = { n.isInstanceOf[Int] } def f2(n:Int): Int = { n + 1 } def f3(n:Any): Int ={ n.asInstanceOf[Int] } val list2 = list.filter(f1).map(f3).map(f2) println(

函数柯里化

匿名 (未验证) 提交于 2019-12-02 23:48:02
什么是函数柯里化?实现 sum(1)(2)(3) 返回结果是1,2,3之和 函数柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术 function sum(a) { return function(b) { return function(c) { return a+b+c; } } } console.log(sum(1)(2)(3)); // 6 引申:实现一个curry函数,将普通函数进行柯里化: function curry(fn, args = []) { return function(){ let rest = [...args, ...arguments]; if (rest.length < fn.length) { return curry.call(this,fn,rest); }else{ return fn.apply(this,rest); } } } //test function sum(a,b,c) { return a+b+c; } let sumFn = curry(sum); console.log(sumFn(1)(2)(3)); //6 console.log(sumFn(1)(2, 3)); //6 Function curry(fn,args){ var