在Julia中是否有函数组合的运算符?

15

假设我有两个函数:

f(x) = x^2
g(x) = x + 2

他们的构成就是函数

h(x) = f(g(x))

在Julia中是否有函数复合的运算符?例如,如果*是一个函数复合的运算符(实际上不是),我们可以编写以下代码:

Julia中是否有函数复合的运算符?例如,如果*是一个函数复合的运算符(实际上不是),我们可以编写以下代码:

h = f * g

顺便说一下:如果我想的话,我可以定义它,

*(f::Function, g::Function) = x -> f(g(x))

请问在Julia中是否已经存在操作符形式?


3
也许使用 运算符(在 REPL 中输入 \circ TAB)会更具数学美感。 - Dan Getz
1
@DanGetz 同意,但这也是默认未定义的。 - a06e
3
默认值的获取路径可能是:在您的代码中定义 -> 放入包中 -> 在流行的包中 -> 最后在Base中。 - Dan Getz
2个回答

17

目前有一个未解决的问题来创建这种运算符,但现在你可以保持语法不变:

julia> h(x) = f(g(x))

或者更清晰一些(对于更复杂的函数):

julia> h(x) = x |> g |> f

目前看来,您需要保留 x 来使其成为复合函数。

另一个选项是创建自己的运算符(就像您建议的那样):

julia> ∘(f::Function, g::Function) = x->f(g(x))
julia> h = f ∘ g

这个方案运行得非常好,但是它引入了一个lambda函数,我无法想到一种在没有lambda的情况下执行这种操作的方法。

注意:@DanGetz建议,∘操作符可以写成\circ。


编辑:似乎未来版本中会有快速闭包,可能很容易实现复合运算符的高效版本。查看此处了解更多。


1
快速闭包现在已经在Julia 0.5中了。有关组合运算符的任何更新吗? - a06e
5
现在在Julia 0.6中已经有了(表示为∘)。 - Frames Catherine White
@Imanol,由于您的答案被接受了,也许您可以考虑更新一下,加上一个注释说明\circ现在是组合运算符?谢谢。 - PatrickT

1
稍后再来。默认情况下, 是可用的。

1
是的,自从https://github.com/JuliaLang/julia/pull/17155以来,Julia现在具有用于函数组合的`∘`运算符。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接