我试图弄清楚如何获得 R 的 callCC 函数,以对函数进行短路评估,以使用 lapply 和 Reduce 等函数。
动机
通过允许您提前退出计算,这将使 Reduce 和 lapply 具有 > O(n) 的渐近效率。
例如,如果我在列表中搜索一个值,我可以在列表中映射一个“finder”函数,第二个发现它 lapply 停止运行并返回该值(很像打破循环,或使用return 声明提前爆发)。
问题是我在编写 lapply 和 Reduce 应该使用 callCC 需要的样式的函数时遇到问题。
例子
假设我正在尝试编写一个函数来在列表中查找值“100”:相当于
imperativeVersion <- function (xs) {
for (val in xs) if (val == 100) return (val)
}
传递给 lapply 的函数如下所示:
find100 <- function (val) { if (val == 100) SHORT_CIRCUIT(val) }
functionalVersion <- function (xs) lapply(xs, find100)
这(显然)崩溃,因为尚未定义短路功能。
callCC( function (SHORT_CIRCUIT) lapply(1:1000, find100) )
问题是这也会崩溃,因为在定义 find100 时短路功能不存在。我想要与此类似的东西。
以下是有效的,因为 SHORT_CIRCUIT 是在创建传递给 lapply 的函数时定义的。
callCC(
function (SHORT_CIRCUIT) {
lapply(1:1000, function (val) {
if (val == 100) SHORT_CIRCUIT(val)
})
)
如何在传递给 lapply 的函数中定义 SHORT_CIRCUIT 而无需像上面那样内联定义它?
我知道这个例子可以使用循环、减少或任何其他数量的方式来实现。我正在寻找一种解决方案来解决将 callCC 与 lapply 和 Reduce 结合使用的问题。
如果我含糊不清或需要任何澄清,请在下面发表评论。我希望有人可以帮助解决这个问题:)
编辑一:方法应该是“生产质量”;没有分离功能或类似的黑魔法。