在 Ramda 中重构复杂计算中的功能差异
Refactoring out functional differences in complex calculations in Ramda
我刚刚开始使用 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) ];
});
我刚刚开始使用 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) ];
});