我刚刚开始使用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坐标调用{{1} }和y1
靠近中间。
是否有一些简单的方法可以重构这种共性,以便我可以执行以下操作:
y2
我知道这甚至不是很接近。我只想表达我想要完成的事情。有什么建议吗?
答案 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) ];
});