8

这可能属于“你不能,而且无论如何也没有理由”,但我很好奇它是否可能。至少,也许这将是一个有趣的 R 谜题。

我在思考cat总是 append \n。但是,cat它的编写方式是它可以将给定的多个参数粘贴在一起(通过...)。

令人惊讶的是,这有效:

> library(functional)
> catnip <- Curry( cat, "\n" )
> catnip("hi")

 hi

但是,\n在用户的文本之前结束。有没有办法对函数进行柯里化,以便您指定柯里化参数总是结束...参数?

4

2 回答 2

10

看起来Curry()非常有效地以与您想要的相反顺序硬连线两个参数列表。这是一个足够简单的函数,你可以构建它的镜像,然后使用它。

Curry2 <- function(FUN, ...) {
    .orig = list(...)
    function(...) do.call(FUN, c(list(...), .orig))
}

catnip <- Curry2( cat, "\n" )
catnip("hi")
于 2012-06-27T18:25:21.693 回答
7

#1。忽略 Curry 的第二个参数并硬编码换行符

试试这个,cat通过在匿名函数中硬编码最后一个参数。它实际上并没有Curry在第一个之后使用参数:

catnip <- Curry(function(...) cat(..., "\n") )

#2。通过柯里化匿名函数来制造函数

这是第二个解决方案,它cat通过使用对 的参数重新排序的匿名函数来处理最后一个cat参数。

catnip2 <- Curry(function(last.arg, ...) cat(..., last.arg), "\n")

# test
catnip2("hi", "there")

#3。通过对更基本的函数进行柯里化来制造所需的函数

也许所有这一切的真正意义在于看看我们如何获取基本组件并将它们库里来获得我们想要的东西。因此我们可以定义一个泛型last.arg.fun,然后通过对它的 curry 来制造所需的功能:

last.arg.fun <- function(FUN, last.arg, ...) FUN(..., last.arg)
catnip3 <- Curry(last.arg.fun, cat, "\n")

# test
last.arg.fun(cat, "\n", "hi", "there")

# test
catnip3("hi", "there")

last.arg.cat如果在某个时候需要,我们可以分两步完成:

last.arg.cat <- Curry(last.arg.fun, cat)
catnip4 <- Curry(last.arg.cat, "\n")

# test
last.arg.cat("\n", "hi", "there")

# test
catnip4("hi", "there")

请注意,每个测试都应该产生一行,说 hi there 以换行符结尾。

编辑:更多解决方案。

于 2012-06-27T18:31:28.657 回答