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

How to alias composite function with keyword arguments?

我可以像这样给单个函数起别名:

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

但是如果我尝试使用复合函数来执行此操作,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"

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

您有以下定义:

∘(f, g) = (x...)->f(g(x...))

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

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

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

编辑:

我已经切换到另一个 OS,我发现 在这里渲染得不是很清晰。我使用了以下符号:

help?> ⋄
"⋄" can be typed by \diamond<tab>

它被定义为允许作为中缀运算符,并且相对容易记住,同时又不会掩盖