柯里化

python高阶函数、柯里化、装饰器、参数注解

匿名 (未验证) 提交于 2019-12-02 22:51:30
一、高阶函数 举例: def counter(base): def inc(step=1) base += step return base return inc 1、自定义sort函数 仿照内建函数sorted,自行实现一个sort函数(不使用内建函数),能够为列表元素排序 内建函数sorted函数是返回一个新的列表,可以设置升序或者降序,可以设置一个排序的函数 sorted函数的实现原理,扩展到map,filter函数的实现原理 方式一: def sort(iterable,reverse=False): ret = [] for x in iterable: for i,y in enumerate(ret): flag = x>y if reverse else x<y if flag: #找到大的就地插入 ret.insert(i,x) break else: ret.append(x) return ret print(sort([1,3,4,52,6,10]) 方式二: def sort(iterable,fn=lambda a,b:a>b): ret = [] for x in iterable: for i,y in enumerate(ret): if fn(x,y): #fn函数的返回值是bool ret.insert(i,x) break else: ret

js柯里化函数

霸气de小男生 提交于 2019-12-02 11:39:33
1 function sub_curry(fn) { 2 var args = [].slice.call(arguments, 1); 3 return function() { 4 return fn.apply(this, args.concat([].slice.call(arguments))); 5 }; 6 } 7 8 function curry(fn, length) { 9 length = length || fn.length; 10 return function() { 11 if (arguments.length < length) { 12 var combined = [fn].concat(Array.prototype.slice.call(arguments)); 13 return curry(sub_curry.apply(this, combined), length - arguments.length); 14 } else { 15 return fn.apply(this, arguments); 16 } 17 }; 18 } 19 20 function add(a, b, c) { 21 console.log(a + b + c); 22 } 23 24 curry(add)(1, 2, 3); 25 curry

JavaScript中的反柯里化

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

函数柯里化的理解与应用

穿精又带淫゛_ 提交于 2019-12-01 16:53:15
函数柯里化我理解,就是可以生成已经部分配置好的函数,这里的重点是生成新函数,因此,柯里化通常应用在需要一批不同的函数,但是这批函数除了部分代码不一样外,其他大部分都是相同的,这时,通过柯里化,能够达到配置函数的目的,减少模板代码 实际实例 在生产环境中,我们一般都会用到动态配置中心,一般动态配置中心的client会允许用户监听一个key,当key值变化后,可以执行用户提供的回调函数,示例代码如下: tcc2.Watch(ctx, PcAppInfoKey, func(value string, err error) { log := common.Logger(ctx) if err != nil { log.WithError(err).Error("tcc2 PcAppInfoKey watch failed") return } err = json.Unmarshal([]byte(value), &pcApps) if err != nil { log.WithError(err).Error("pc apps json unmarshal failed") return } }, time.Second * 30) tcc2.Watch(ctx, MobileAppInfoKey, func(value string, err error) { log :=

函数式编程杂谈

梦想的初衷 提交于 2019-11-29 18:56:56
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/gqw57pBYB4VRGKmNlkAODg 作者:张文博 比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算。本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处。 一、编程范式综述 编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为“编程范式”。编程语言日新月异,从汇编、Pascal、C、C++、Ruby、Python、JS,etc...其背后的编程范式其实并没有发生太多变化。抛开各语言繁纷复杂的表象去探究其背后抽象的编程范式可以帮助我们更好地使用computer进行compute。 1.命令式 计算机本质上是执行一个个指令,因此编程人员只需要一步步写下需要执行的指令,比如:先算什么再算什么,怎么输入怎么计算怎么输出。所以编程语言大多都具备这四种类型的语句: 运算语句将结果存入存储器中以便日后使用; 循环语句使得一些语句可以被反复运行; 条件分支语句允许仅当某些条件成立时才运行某个指令集合; 以及存有争议的类似goto这样的无条件分支语句。 使得执行顺序能够转移到其他指令之处。 无论使用汇编、C、Java、JS 都可以写出这样的指令集合

函数式编程杂谈

☆樱花仙子☆ 提交于 2019-11-29 18:37:20
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/gqw57pBYB4VRGKmNlkAODg 作者:张文博 比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算。本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处。 一、编程范式综述 编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为“编程范式”。编程语言日新月异,从汇编、Pascal、C、C++、Ruby、Python、JS,etc...其背后的编程范式其实并没有发生太多变化。抛开各语言繁纷复杂的表象去探究其背后抽象的编程范式可以帮助我们更好地使用computer进行compute。 1.命令式 计算机本质上是执行一个个指令,因此编程人员只需要一步步写下需要执行的指令,比如:先算什么再算什么,怎么输入怎么计算怎么输出。所以编程语言大多都具备这四种类型的语句: 运算语句将结果存入存储器中以便日后使用; 循环语句使得一些语句可以被反复运行; 条件分支语句允许仅当某些条件成立时才运行某个指令集合; 以及存有争议的类似goto这样的无条件分支语句。 使得执行顺序能够转移到其他指令之处。 无论使用汇编、C、Java、JS 都可以写出这样的指令集合

JavaScript柯里化(currying)

浪尽此生 提交于 2019-11-29 01:45:26
参考: https://www.jianshu.com/p/33392cb4b055 https://ruby-china.org/topics/38385 https://stackoverflow.com/questions/36314/what-is-currying 柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的。 简单的javascript例子: function add(x, y){ if(y===undefined){ return (z) => x + z; }else{ return x+y; } } 测试 add(1)(2)和add(1, 2)都返回3. 我理解currying,即乐高模块化,如果要写一个复杂函数,可以分解成单一功能的模块,然后组装在一起。这样每个模块就可以在其他函数进行反复调用了。 例子: 对已知数组的已知量进行加N的操作,传统的写法: let ar= [1,2,3]; function addToArray(ar,n){ return ar.map((x)=> x+n) }; console.log(addToArray(ar,1)

尾调用和尾递归

感情迁移 提交于 2019-11-28 01:56:48
尾调用 1. 定义 尾调用是函数式编程中一个很重要的概念,当一个函数执行时的最后一个步骤是返回另一个函数的调用,这就叫做尾调用。 注意这里函数的调用方式是无所谓的,以下方式均可: 函数调用: func(···) 方法调用: obj.method(···) call调用: func.call(···) apply调用: func.apply(···) 复制代码 并且只有下列表达式会包含尾调用: 条件操作符: ? : 逻辑或: || 逻辑与: && 逗号: , 复制代码 依次举例: const a = x => x ? f() : g(); // f() 和 g() 都在尾部。 复制代码 const a = () => f() || g(); // g()有可能是尾调用,f()不是 // 因为上述写法和下面的写法等效: const a = () => { const fResult = f(); // not a tail call if (fResult) { return fResult; } else { return g(); // tail call } } // 只有当f()的结果为falsey的时候,g()才是尾调用 复制代码 const a = () => f() && g(); // g()有可能是尾调用,f()不是 // 因为上述写法和下面的写法等效: const

python高阶函数、柯里化、装饰器、参数注解

南楼画角 提交于 2019-11-28 01:49:32
一、高阶函数 函数在python中是一等公民 函数也是对象,可调用的对象 函数可以作为普通变量,参数,返回值等等 高阶函数应当是至少满足:接受一个或多个函数作为参数;输出是一个函数 举例: def counter(base): def inc(step=1) base += step return base return inc 1、自定义sort函数 思路: 仿照内建函数sorted,自行实现一个sort函数(不使用内建函数),能够为列表元素排序 内建函数sorted函数是返回一个新的列表,可以设置升序或者降序,可以设置一个排序的函数 sorted函数的实现原理,扩展到map,filter函数的实现原理 方式一: def sort(iterable,reverse=False): ret = [] for x in iterable: for i,y in enumerate(ret): flag = x>y if reverse else x<y if flag: #找到大的就地插入 ret.insert(i,x) break else: ret.append(x) return ret print(sort([1,3,4,52,6,10]) 方式二: def sort(iterable,fn=lambda a,b:a>b): ret = [] for x in