重构Ramda中复杂计算的功能差异

时间:2015-07-30 18:17:07

标签: functional-programming ramda.js

我刚刚开始使用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) ];
                });

请注意,centroidXcentroidY之间的唯一区别是X坐标在中间附近调用x1x2,Y坐标调用{{1} }和y1靠近中间。

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

y2

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

1 个答案:

答案 0 :(得分:1)

我赶紧回答,所以我可能会遗漏一些简单的东西。但有没有理由说它必须完全没有点?

为什么不

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) ];
});