这可能属于"你不能,也没有理由",但我很好奇是否有可能.至少,也许这将是一个有趣的R拼图.
我正在考虑cat总是追加\n.但是,cat编写它是为了将它与给定的参数(via ...)粘贴在一起.
令人惊讶的是,这有效:
> library(functional)
> catnip <- Curry( cat, "\n" )
> catnip("hi")
hi
Run Code Online (Sandbox Code Playgroud)
但是,在\n用户的文本之前结束.有没有办法来讨论函数,以便你指定curried参数总是结束...参数?
Jos*_*ien 10
看起来Curry()非常有效地将两个参数列表与你想要的相反的顺序硬连接起来.这是一个足够简单的功能,你可以构建它的镜像,然后使用它.
Curry2 <- function(FUN, ...) {
.orig = list(...)
function(...) do.call(FUN, c(list(...), .orig))
}
catnip <- Curry2( cat, "\n" )
catnip("hi")
Run Code Online (Sandbox Code Playgroud)
#1.忽略Curry的第二个参数并硬编码换行符
尝试cat通过在匿名函数中对其进行硬编码来讨论最后一个参数.它实际上并没有Curry在第一个之后使用参数:
catnip <- Curry(function(...) cat(..., "\n") )
Run Code Online (Sandbox Code Playgroud)
#2.通过讨论匿名功能来制造功能
这是第二个解决方案,cat通过使用重新排序cat参数的匿名函数来讨论最后一个参数.
catnip2 <- Curry(function(last.arg, ...) cat(..., last.arg), "\n")
# test
catnip2("hi", "there")
Run Code Online (Sandbox Code Playgroud)
#3.通过更加基本的功能来制造所需的功能
也许所有这一切的真正意义在于看看我们如何能够采用基本组件并将它们用于满足我们的需求.因此,我们可以定义一个将军last.arg.fun,然后通过它的咖喱制造所需的功能:
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")
Run Code Online (Sandbox Code Playgroud)
如果我们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")
Run Code Online (Sandbox Code Playgroud)
请注意,每个测试都应该生成一行代表,然后以换行符结束.
编辑:更多解决方案.