gpt4 book ai didi

functional-programming - 如何将数据传递到组合管道的后期阶段

转载 作者:行者123 更新时间:2023-12-04 10:57:36 25 4
gpt4 key购买 nike

如果我有一堆严格链接在一起的函数,那么使用 compose 就很容易了。将它们结合起来:

f1 : A -> B
f2 : B -> C
f3 : C -> D
pipe(f1, f2, f3) : A -> D

我经常发现事情并不是那么完美, A 中包含的信息在稍后阶段再次需要:
f1 : A -> B
f2 : B -> C
f3 : (A, C) -> D

我如何优雅地组合这些功能?我觉得我想要某种“藏匿处”来塞住 A成对什么的, map pipe(f1,f2)在第二个元素上,然后我为 f3 准备好了一切.不过,我想不出一个非常优雅的方法来做这件事,而且感觉这是一个足够普遍的情况,必须有一个既定的模式!

作为一个具体的例子,假设我有一个字符串,如果它的长度是偶数,我想返回它,否则我想返回 none .
f1 = len
f2 = mod(2)
f3 = (s, m) => m == 0 ? Just(s) : None

我如何将这些组合在一起?

最佳答案

函数组合的类型不允许这样做。我认为 lambda 和 currying 比通过组合传递元组类型更简单明了:

const f1 = s => s.length;
const f2 = n => n % 2;
const f3 = s => m => m === 0 ? s : null;
const comp3 = f => g => h => x => f(g(h(x)));

const main = s => comp3(f3(s)) (f2) (f1) (s);

console.log(main("hallo"));
console.log(main("halloo"));


如果您绝对希望它自由点,您还可以利用函数组合可能产生另一个函数的事实:

const f1 = s => s.length;
const f2 = n => n % 2;
const f3 = s => m => m === 0 ? s : null;
const comp3 = f => g => h => x => f(g(h(x)));
const join = f => x => f(x) (x); // monadic join
const flip = f => y => x => f(x) (y);

const main = join(comp3(flip(f3)) (f2) (f1));

console.log(main("hallo"));
console.log(main("halloo"));


虽然很难读。

关于functional-programming - 如何将数据传递到组合管道的后期阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59084091/

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