2016-03-30 22 views
7

Sagen, ich habe zwei Funktionen:Gibt es einen Operator für die Funktionszusammensetzung in Julia?

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

Ihre Zusammensetzung ist die Funktion

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

Gibt es einen Operator für die Funktions Zusammensetzung in Julia? Zum Beispiel, wenn * ein Operator für die Funktions Zusammensetzung war (was es nicht ist), könnten wir schreiben:

h = f * g 

P. S. Ich weiß, ich kann es definieren, wenn ich will,

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

nur gefragt, ob es einen Operator Form bereits in Julia ist.

+0

Vielleicht mit dem '∘'-Operator (Eingabe mit' \ circ' TAB bei REPL) dient für eine bessere Mathematik-Look. –

+0

@DanGetz Zustimmen, aber das ist auch undefiniert standardmäßig. – becko

+3

Die Route für die Standardeinstellungen wäre wahrscheinlich: Definieren Sie in Ihrem Code -> In einem Paket -> In einem beliebten Paket -> In Base. –

Antwort

11

Es ist derzeit ein open issue solche Betreiber zu schaffen, aber wie jetzt können Sie auf die Syntax halten:

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

oder ein bisschen mehr klarer (für komplexere Funktionen):

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

Es scheint, als ob Sie jetzt die x behalten müssten, um es zu einer zusammengesetzten Funktion zu machen.

Eine weitere Möglichkeit, Ihre eigenen Operator erstellen (wie Sie vorschlagen):

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

Diese völlig in Ordnung, funktioniert es jedoch eine Lambda-Funktion einführt, und ich kann einen Weg zur Durchführung einer solchen Operation nicht denken, ohne Lambda.

HINWEIS: ∘ Operator kann als \ circ wie @DanGetz vorgeschlagen geschrieben werden.


EDIT: scheint fast closures in zukünftigen Versionen kommen und wird wahrscheinlich leicht eine effiziente Version des Verbund Operator zu implementieren.

+1

schnelle Verschlüsse sind jetzt in Julia 0.5. Gibt es Updates für einen Kompositionsoperator? – becko

+1

Dies ist jetzt in Julia 0.6 (als ∘) –