Julia 带有附加参数的管道

Julia 带有附加参数的管道,julia,Julia,我在好几个地方读到,Julia中的管道只适用于只接受一个参数的函数。这是不正确的,因为我可以做到以下几点: function power(a, b = 2) a^b end 3 |> power > 9 而且效果很好 然而,我不能完全理解管道。例如,为什么这不起作用??: 3 |> power() > MethodError: no method matching power() 实际上,我想做的是使用管道并定义其他参数,例如关键字参数,以便在管道安装时(即唯一的位置

我在好几个地方读到,Julia中的管道只适用于只接受一个参数的函数。这是不正确的,因为我可以做到以下几点:

function power(a, b = 2) a^b end
3 |> power
> 9
而且效果很好

然而,我不能完全理解管道。例如,为什么这不起作用??:

3 |> power()
> MethodError: no method matching power()
实际上,我想做的是使用管道并定义其他参数,例如关键字参数,以便在管道安装时(即唯一的位置参数)可以清楚地传递哪个参数:

有没有办法做这样的事


我知道我可以用
Pipe
包来解决问题,但老实说,在一半行的开头写
@Pipe
感觉有点笨拙


R
中,
magritrr
包具有令人信服的逻辑(在我看来):默认情况下,它将管道左侧的作为第一个参数传递给右侧的函数-我正在寻找类似的东西。

第一个代码段中定义的power有两种方法。一个有一个论点,一个有两个论点。因此,关于只使用一个参数方法的观点仍然成立

您想做的事情称为“部分应用程序”,在函数式语言中非常常见。你总是可以写

3 |> (a -> power(a, 3))
但这很快就会变得笨重。其他语言有类似于
power(%1,3)
的语法来表示lambda。有必要增加一些类似于朱莉娅的东西,但很难做到正确<代码>管道正是基于宏的修复程序

如果您可以控制所定义的方法,那么还可以使用一个接口来实现方法,该接口可以根据您的喜好返回部分应用的版本——Base中的许多谓词已经这样做了,例如,
==(1)
。还有
Base.Fix2(power,3)
选项,但如果你问我的话,这并不是一个真正的改进(除了可能对编译器更友好)


请注意,
magrittr
s管道也可以使用。不同之处在于,传入R的参数要复杂得多,您无法从外部看到参数是用作值还是用作表达式(本质上,R传递一个包含表达式和指向父环境的指针的thunk,如果您将其用作值,则会自动计算并缓存它;请参见)

,但是对于这样短的函数定义,您可以使用
power(a,b=2)=a^b
而不是
function power(a,b=2)a^b end
3 |> (a -> power(a, 3))