什么是函数组合?

菜园前端
• 阅读 383

原文链接:https://note.noxussj.top/?source=helloworld


什么是函数组合?

函数组合(Compose),如果一个函数要经过多个函数处理才能得到最终值,这个时候可以把中间过程的函数合并成一个函数。函数组合默认是从右到左执行,每个函数只能接收一个参数,否则需使用柯里化进行转换。

作用

函数组合可以让我们把细粒度的函数重新组合生成一个新的函数。

规则

函数的组合要满足结合律(associativity),无论先结合前面几个参数或者是先结合后面几个参数返回的结果都是一样的。类似于数学中的加法,1 + 2 + 3 中的 (1 + 2) + 3 或者 1 + (2 + 3) 返回的结果都是一样的。

常见问题

  1. 纯函数和柯里化很容易写出洋葱代码 a(b(c(d))),中间哪个环节出现问题,不容易排查。
  2. 为什么函数组合默认是从右往左执行,因为这样更加接近于函数调用的写法,a(b(c(d)))。

基础案例

函数组合

// 函数组合(从右往左执行 )
function compose(...args) {
    return function (value) {
        return args.reverse().reduce((a, fn) => fn(a), value)
    }
}

// 反转数组
const reverse = (arr) => arr.reverse()

// 取第一项值
const first = (arr) => arr[0]

// 转换为大写
const toUpper = (s) => s.toUpperCase()

const f = compose(toUpper, first, reverse)

f(['a', 'b', 'c']) // C

判断是否满足结合律

const f3 = compose(compose(toUpper, first), reverse)

const f3 = compose(toUpper, compose(first, reverse))

let associative = f2(['a', 'b', 'c']) === f3(['a', 'b', 'c']) // true
点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Irene181 Irene181
3年前
一篇文章带你了解Python高阶函数
一、什么是高阶函数?高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数。通过案例代码分析,一步一步深入概念。二、变量可以指向函数以Python内置的求绝对值的函数abs()为例。调用该函数用以下代码:print(abs(10))运行结果:但是,如果只写abs呢?prin
Irene181 Irene181
3年前
一篇文章带你了解Python高阶函数
一、什么是高阶函数?高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数。通过案例代码分析,一步一步深入概念。二、变量可以指向函数以Python内置的求绝对值的函数abs()为例。调用该函数用以下代码:print(abs(10))运行结果:但是,如果只写abs呢?prin
Souleigh ✨ Souleigh ✨
4年前
初识 JS 中的柯里化
作为函数式编程语言,JS带来了很多语言上的有趣特性,比如柯里化。1.简介柯里化(Currying),又称部分求值(PartialEvaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。核心思想是把多参数传入的函数拆成单参数(或部分)函
菜园前端 菜园前端
1年前
什么是函数式编程?
原文链接:什么是函数式编程?函数式编程(FunctionalProgramming,FP)就是利用纯函数实现细粒度的函数,然后再通过函数的组合把细粒度的函数组合成功能更强大的函数。函数式编程中的"函数"不是程序中的函数(方法),而是数学中的函数(映射关系)
菜园前端 菜园前端
1年前
什么是函数柯里化?
原文链接:什么是函数柯里化?函数柯里化(HaskellBrooksCurry),当一个函数有多个参数的时候先传递一部分参数并且调用它(这部分参数后续不会进行改变),然后返回一个新的函数接收剩余的参数并返回结果。总结柯里化可以让我们给一个函数传递较少的参数得
菜园前端 菜园前端
1年前
什么是高阶函数?
原文链接:什么是高阶函数?有两种情况都可以被定义为高阶函数,第一种是把函数作为参数传递给另外一个函数,第二种是把函数作为另一个函数的返回结果。就像我们平时调用函数,一般都是传递值类型或者对象和数组等参数,或者是函数返回结果是值类型或者是对象和数组,高阶函数
Stella981 Stella981
3年前
PostgreSQL数据库切割和组合字段函数
Postgresql里面内置了很多的实用函数,下面介绍下组合和切割函数环境:PostgreSQL9.1.2     CENTOS5.7final一.组合函数1.concata.语法介绍concat(str"any",str"any",...)
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
3年前
Python进阶
python高阶函数可以接受函数作为参数的函数defadd(x,y,f):   returnf(x)f(y)由于参数想,x,y和f都可以任意传入,如果f传入其他函数,就可以得到不同的返回值map()函数它接收一个函数f和一个list,并通过把函数f依次作用在list的每