如何使用关键字参数为复合函数别名?

Ale*_*lec 2 alias function-composition julia

我可以像这样为单个函数设置别名:

julia> f(y;x=1) = x * y
f (generic function with 2 methods)
julia> const g = f
f (generic function with 1 method)
julia> g(3,x=2)
6
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用复合函数来做到这一点,kwarg 会引起麻烦:

julia> const gg= sqrt ? f
#62 (generic function with 1 method)
julia> gg(3,x=2)
ERROR: MethodError: no method matching (::Base.var"#62#63"{typeof(sqrt),typeof(f)})(::Int64; x=2)
Closest candidates are:
  #62(::Any...) at operators.jl:875 got unsupported keyword argument "x"
Run Code Online (Sandbox Code Playgroud)

这个问题有方法解决吗?我正在尝试将参数传递给f,然后通过快捷方式(gg在上面的 MWE 中)转换该结果。

Bog*_*ski 6

您有以下定义:

?(f, g) = (x...)->f(g(x...))
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它不支持关键字参数。也许你可以打开一个问题来讨论允许它们。

现在你可以像这样定义你自己的版本:

julia> ?(f, g) = (x...; kw...)->f(g(x...; kw...))
? (generic function with 1 method)

julia> f(y;x=1) = x * y
f (generic function with 1 method)

julia> const gg = sqrt ? f
#1 (generic function with 1 method)

julia> gg(3,x=2)
2.449489742783178
Run Code Online (Sandbox Code Playgroud)

编辑:

我已切换到其他操作系统,我发现?这里的效果不是很清晰。我使用了以下符号:

help?> ?
"?" can be typed by \diamond<tab>
Run Code Online (Sandbox Code Playgroud)

它被定义为允许作为中缀运算符并且相对容易记住而不是遮蔽?.