gpt4 book ai didi

javascript - "combine"以功能方式在 javascript 中运行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:48:51 28 4
gpt4 key购买 nike

我正在学习函数式编程,我想知道是否有一种方法可以像这样“组合”函数:

function triple(x) {
return x * 3;
}
function plusOne(x) {
return x + 1;
}
function isZero(x) {
return x === 0;
}
combine(1); //1
combine(triple)(triple)(plusOne)(1); // 10
combine(plusOne)(triple)(isZero)(-1); // true

如果para是一个函数,它就把这个函数“组合”成它自己,如果不是它就返回最后的结果。谢谢!

最佳答案

传承

这是数学中的一个概念,叫做 function composition .

       f(x) = y
g(y) = z

g(f(x)) = z

(g•f)(x) = z

最后一行是“g of f of x equals z”。组合函数的优点在于消除了。请注意,在 g(f(x)) = z 中,我们采用 x 输入并获得 z 输出。这将跳过中间点 y

组合是创造的好方法 higher-order functions并保持你的代码闪闪发光。很明显我们为什么要在我们的 Javascript 程序中使用它。


补偿

JavaScript 是一种多范式语言,具有丰富的函数支持。我们可以创建一个简单的 comp 函数,它结合了两个输入函数,gf,并产生一个 功能 -

function triple(x) {
return x * 3
}

function plusOne(x) {
return x + 1
}

function comp(g, f) {
return function(x) {
return g(f(x)) // "g of f of x"
}
}

const myfunc =
comp(triple, plusOne)

console.log(myfunc(1))

评价

triple(plusOne(1))
triple(2)
6

撰写

正如问题所暗示的,我们很可能想要组合两个以上的函数。下面我们编写 compose,它采用 all 输入函数,并使用我们上面的简单 compreduce它们。如果没有给出函数,我们返回空函数,identity -

const triple = (x) =>
x * 3

const plusOne = (x) =>
x + 1

const comp = (g, f) =>
x => g(f(x)) // "g of f of x"

const identity = (x) =>
x

const compose = (...all) =>
all.reduce(comp, identity)

const myfunc =
compose(triple, triple, plusOne) // any amount of funcs

console.log(myfunc(1))

评价

triple(triple(plusOne(1)))
triple(triple(2))
triple(6)
18

管道

您可以随心所欲地发挥创意。下面,我们编写了 pipe,它允许我们的程序以舒适的从左到右的方向阅读 -

const triple = (x) =>
x * 3

const plusOne = (x) =>
x + 1

const pipe = x =>
f => pipe(f(x))

pipe(1)(plusOne)(triple)(triple)(console.log) // 18
pipe(3)(triple)(plusOne)(triple)(plusOne)(console.log) // 31

表达式一的求值-

f => pipe(f(1))
pipe(plusOne(1))
f => pipe(f(2))
pipe(triple(2))
f => pipe(f(6))
pipe(triple(6))
f => pipe(f(18))
pipe(console.log(18))
18

和表达式二-

f => pipe(f(3))
pipe(triple(3))
f => pipe(f(9))
pipe(plusOne(9))
f => pipe(f(10))
pipe(triple(10))
f => pipe(f(30))
pipe(plusOne(31))
f => pipe(f(31))
pipe(console.log(31))
31

相关技术

Curried 函数部分应用 是与函数组合融为一体的概念。上面的pipeanother Q&A中引入作为 $ 并在此处再次演示 -

const $ = x =>           // "pipe", or whatever name you pick
k => $ (k (x))

const add = x => y => // curried add
x + y

const mult = x => y => // curried mult
x * y

$ (1) // 1
(add (2)) // + 2 = 3
(mult (6)) // * 6 = 18
(console.log) // 18

$ (7) // 7
(add (1)) // + 1 = 8
(mult (8)) // * 8 = 64
(mult (2)) // * 2 = 128
(mult (2)) // * 2 = 256
(console.log) // 256

关于javascript - "combine"以功能方式在 javascript 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198102/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com