Functional programming 在Ramda中重构复杂计算中的函数差异
我刚刚开始使用Ramda,一般来说,我对函数式编程比较陌生。我开始掌握如何组织程序的诀窍,但我一直在某个方面感到困惑。我觉得我肯定错过了一些关键概念 我甚至不知道该如何表达我的问题,所以我将从一个例子开始。此代码段是任意多边形质心计算的一部分:Functional programming 在Ramda中重构复杂计算中的函数差异,functional-programming,ramda.js,Functional Programming,Ramda.js,我刚刚开始使用Ramda,一般来说,我对函数式编程比较陌生。我开始掌握如何组织程序的诀窍,但我一直在某个方面感到困惑。我觉得我肯定错过了一些关键概念 我甚至不知道该如何表达我的问题,所以我将从一个例子开始。此代码段是任意多边形质心计算的一部分: var centroidX = R.converge( R.divide, R.compose( R.sum,
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) ];
});
哈好吧,我不觉得自己很傻。当然,这是有道理的。谢谢你花时间帮忙。我是免费积分代码的忠实粉丝。但我认为我们经常过分崇拜它。一个位置合适的匿名函数通常会让事情变得更清楚。有时候,在高层也更直接。