快速写curry函数和compose函数

我一直都把编程作为一项极其富有创造性和乐趣的工作,其意义就在于我们可以接触各种迷人而富有远见的编程思想,站在巨人的肩膀上眺望未来。

作为一名懒癌晚期编程工作者,任何可以让我少写代码的编程思想对我来说都是一种鸦片,代码本身就应当是简洁而美的,一个人写出来的代码,就是他的整个思想世界。

作为一名菜鸟,最近学习到函数式编程,立即就被这种声明示的编程模式吸引,实在没有更直白的编程方式了,这就是一个小孩或者天才应当使用的编程模式,像我这种半只脚步入中年的程序员,只能喟然嗟叹。

函数式编程应当有三个基石:纯函数,柯里化,组合化。

纯函数输出不被输入左右,自给自足,就像一截管道,放哪都能承上启下。

柯里化指对函数参数列表从左至右进一步拆分,把管道拆分成管环,所有管环拼接到一起才有结果流出:

  const pipe = (a,b,c) => a+b+c;

  const rings = curry(pipe);

  const ring_a = rings( ‘a‘ );

  const ring_ab = rings( ‘a‘ , ‘b‘ ); // 和 rings( ‘a‘ )( ‘b‘ ) 等价,缺少最后的管环

  const ring_abc = rings( ‘a‘ , ‘b‘ , ‘c‘ ); // 和 ring_ab( ‘c‘ ) 等价,完成有输出 ‘abc‘

上边的curry函数如果要从别的库引入,个人认为是不保险的,首先不能保证它是否引入多余的代码或者不符合使用场景的需求,自己造出来的轮子,出问题可以自己处理,修复别人的轮子会浪费大量时间。前段时间我就因为偷懒,用了mint-ui的一个组件,结果h5页面在oppo上出现重复点击出现位移的bug,花了半天看它的源码才找到问题所在。

下面是我自己实现的curry,比较简陋,但是能用:

  const curry = ( f,length ) => { length = length || f.length ; return (...usedArgs) => length - usedArgs.length > 0 ? curry( (...restArgs) => f.call(this,...usedArgs,...restArgs), length - usedArgs.length) : f.apply(this,usedArgs)}

组合化指将不同的管道拼接起来,前一个纯函数的流出流入下一个管道,顺理成章。需要注意的是这里管道的拼接顺序是从右至左的,按理说也应该是从左至右流通,不过可能是函数的参数写在函数名右边的原因,compose比curry好实现:

  const compose = (...functions) => flowIn => functions.reduceRight( ( acc,f ) => f(acc), flowIn )

最后利用curry和compose函数可以自己拼接管道,实现各种功能:

  const pipe1 = curry( (x,y)  => x + y)

  const pipe2 = x => x * x

  const pipes = compose( pipe2 , pipe1(2) )

  pipes( 1 ) // 9

原文地址:https://www.cnblogs.com/lowki/p/10853244.html

时间: 2024-10-11 00:11:28

快速写curry函数和compose函数的相关文章

JS高阶编程技巧--compose函数

先看代码: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 = function (x) { return x / 10; }; console.log(fn3(fn1(fn2(fn1(6))))); 这是几个简单的运算方法,但想输出的是一个多层函数嵌套的运行结果,即把前一个函数的运行结果赋值给后一个函数,当然我们可以写成一下这样: let x = fn1(

php 函数strtr 替换函数实例解析 strtr 速度比较快

先来看看这个php字符串替换函数 PHP字符串替换函数strtr()的两种状态 strtr(string,from,to) 或者strtr(string,array) 首先针对PHP字符串替换函数strtr()第一种方式 我们看看下面的举例: <?php echo strtr("I Love you","Lo","lO"); ?> 得到的结果是 I lOve yOu 这个结果提醒我们 1.strtr它是区分大小写的 2.PHP字符串替

compose函数

在学习redux源码的时候看到了其中的工具函数compose,compose函数的作用就是组合函数,依次执行传入的函数: 按顺序依次执行 第一个执行的函数可以接受多个参数,后面的函数只有接受单个参数:前一个的返回值传给下一个 reduce实现 redux中是使用reduce实现的 function compose(...funcs) { //没有传入函数参数,就返回一个默认函数(直接返回参数) if (funcs.length === 0) { return arg => arg } if (f

快学Scala(12)--高阶函数

在函数式编程语言中,你只需要将明细动作包在函数当中作为参数传入即可. 作为值的函数 import scala.math._ class TestFun { val num = 3.14 val fun = ceil _ } 这段代码将num设为3.14,fun设为ceil函数.ceil函数后面的_意味着你确实指的是这个函数,而不是碰巧忘记了给他送参数 Array(3.14, 1.42, 2.0).map(fun) //Array(4.0, 2.0, 2.0) map方法接受一个函数参数,将它应用

用聚合数据API快速写出小程序(苏州实时公交)

利用聚合数据API快速写出小程序,过程简单. 1.申请小程序账号 2.进入开发 3.调用API.比如"苏州实时公交"小程序,选择的是苏州实时公交API. 苏州实时公交API文档:https://www.juhe.cn/docs/api/id/31 如下,是"苏州实时公交"小程序调用代码:  var url = "https://apis.juhe.cn/szbusline/bus";    //为了您的密钥安全,建议使用服务端代码中转请求,事例代

快速写一个babel插件

es6/7/8的出现,给我们带来了很多方便,但是浏览器并不怎么支持,目前chrome应该是支持率最高的,所以为了兼容我们只能把代码转成es5,这应该算是我们最初使用babel的一个缘由,随着业务的开发,我们会有很多自己定制化的需求,单纯的bebel并不能解决我们所有的问题,所以babel插件应用而来,本文将会采用较为通俗的语言来描述如何快速写一个babel插件. 一.babel的作用 babel的作用其实就是一个转换器,把我们的代码转成浏览器可以运行的代码,类似于加工厂的概念.解析代码都是一个文

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

地瓜君的excel小课堂——行函数与列函数

大家用Excel处理数据的时候经常会用到一些查找引用函数,今天地瓜君就来和大家一起学习一下查找引用函数中的行函数与列函数啦. 导航:1.row函数 2.rows函数 3.column函数 4.columns函数 我们重点介绍这4个函数里最常见也是非常实用的函数row函数,其他3个函数不是最常用所以就稍微简单的介绍下啦 一.row函数(返回一个引用的行号) 语法:=row(reference) 说明:如果省略reference(参数),则默认返回row函数所在单元格的行号. 参数reference

每天记一些php函数,jQuery函数和linux命令(二)

简介:学习完了php和jQuery之后,对函数的记忆不到位,导致很多函数没记住,所以为了促进自己的记忆,每天花一点时间来写这个博客. 时间:2016-12-19   地点:太原    天气:晴 一.php函数 1.array_column()函数          返回数组中指定的一列(php5=>php5.5) 说明: array array_column(array $input,mixed $column_key[,mixed $index_key]) array_column()返回in