Functional programming 在Ramda中重构复杂计算中的函数差异

Functional programming 在Ramda中重构复杂计算中的函数差异,functional-programming,ramda.js,Functional Programming,Ramda.js,我刚刚开始使用Ramda,一般来说,我对函数式编程比较陌生。我开始掌握如何组织程序的诀窍,但我一直在某个方面感到困惑。我觉得我肯定错过了一些关键概念 我甚至不知道该如何表达我的问题,所以我将从一个例子开始。此代码段是任意多边形质心计算的一部分: var centroidX = R.converge( R.divide, R.compose( R.sum,

我刚刚开始使用Ramda,一般来说,我对函数式编程比较陌生。我开始掌握如何组织程序的诀窍,但我一直在某个方面感到困惑。我觉得我肯定错过了一些关键概念

我甚至不知道该如何表达我的问题,所以我将从一个例子开始。此代码段是任意多边形质心计算的一部分:

var centroidX = R.converge(
                    R.divide,
                    R.compose(
                        R.sum,
                        R.map(
                            R.converge(
                                R.multiply,
                                R.converge(R.add, x1, x2),
                                diffOfProducts
                            )
                        ),
                        makeVertexPairs
                    ),
                    sixTimesPolyArea
                );
var centroidY = R.converge(
                    R.divide,
                    R.compose(
                        R.sum,
                        R.map(
                            R.converge(
                                R.multiply,
                                R.converge(R.add, y1, y2),
                                diffOfProducts
                            )
                        ),
                        makeVertexPairs
                    ),
                    sixTimesPolyArea
                );
Geom.centroid = R.curry(function(vertices) {
                    return [ centroidX(vertices), centroidY(vertices) ];
                });
请注意,
centroidX
centroidY
之间的唯一区别是,X坐标调用中间附近的
x1
x2
,Y坐标调用中间附近的
y1
y2

是否有一些简单的方法来重构这种公共性,以便我可以执行以下操作:

var centroidCoord = R.converge(
                    R.divide,
                    R.compose(
                        R.sum,
                        R.map(
                            R.converge(
                                R.multiply,
                                R.converge(R.add, R.__, R.__),
                                diffOfProducts
                            )
                        ),
                        makeVertexPairs
                    ),
                    sixTimesPolyArea
                );
Geom.centroid = R.curry(function(vertices) {
                    return [ centroidX(x1, x2, vertices), centroidY(y1, y2, vertices) ];
                });

我知道这还不算接近。我只是想表达我想要完成的事情。有什么建议吗?

我回答得很匆忙,所以我可能遗漏了一些简单的东西。但是,有没有一个理由,它必须是完全免费的

为什么不

var centroid = (coord1, coord2, vertices) => R.converge(
// ...
                        R.converge(
                            R.multiply,
                            R.converge(R.add,coord1, coord2),
                            diffOfProducts
                        )
// ...
)(vertices);

Geom.centroid = R.curry(function(vertices) {
    return [ centroid(x1, x2, vertices), centroid(y1, y2, vertices) ];
});

哈好吧,我不觉得自己很傻。当然,这是有道理的。谢谢你花时间帮忙。我是免费积分代码的忠实粉丝。但我认为我们经常过分崇拜它。一个位置合适的匿名函数通常会让事情变得更清楚。有时候,在高层也更直接。