1

我刚刚开始使用 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 坐标调用x1x2靠近中间,而 Y 坐标调用y1y2靠近中间。

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

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

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

4

1 回答 1

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) ];
});
于 2015-07-30T20:49:02.030 回答