Function composition: Difference between revisions

m
(→‎{{header|Objective-C}}: added blocks implementation)
 
(251 intermediate revisions by more than 100 users not shown)
Line 1:
{{task|Higher-order functions}}
 
Create a function, <span style="font-family:serif">compose</span>, whose two arguments <span style="font-family:serif">''f''</span> and <span style="font-family:serif">''g''</span>, are both functions with one argument. The result of <span style="font-family:serif">compose</span> is to be a function of one argument, (lets call the argument <span style="font-family:serif">''x''</span>), which works like applying function <span style="font-family:serif">''f''</span> to the result of applying function <span style="font-family:serif">''g''</span> to <span style="font-family:serif">''x''</span>, i.e,
;Task:
: <span style="font-family:serif">compose(''f'', ''g'') (''x'') = ''f''(''g''(''x''))</span>
Create a function, <span style="font-family:serif">compose</span>, &nbsp; whose two arguments &nbsp; <span style="font-family:serif">''f''</span> &nbsp; and &nbsp; <span style="font-family:serif">''g''</span>, &nbsp; are both functions with one argument.
 
 
The result of <span style="font-family:serif">compose</span> is to be a function of one argument, (lets call the argument &nbsp; <span style="font-family:serif">''x''</span>), &nbsp; which works like applying function &nbsp; <span style="font-family:serif"> ''f'' </span> &nbsp; to the result of applying function &nbsp; <span style="font-family:serif"> ''g'' </span> &nbsp; to &nbsp; <span style="font-family:serif"> ''x''</span>.
 
 
;Example:
<span style="font-family:serif">compose(''f'', ''g'') (''x'') = ''f''(''g''(''x''))</span>
 
 
Reference: [[wp:Function composition (computer science)|Function composition]]
 
Hint: In some languages, implementing <span style="font-family:serif">compose</span> correctly requires creating a [[wp:Closure (computer science)|closure]].
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V compose = (f, g) -> (x -> @f(@g(x)))
V sin_asin = compose(x -> sin(x), x -> asin(x))
print(sin_asin(0.5))</syntaxhighlight>
 
{{out}}
<pre>
0.5
</pre>
 
=={{header|ActionScript}}==
ActionScript supports closures, making function composition very straightforward.
<langsyntaxhighlight ActionScriptlang="actionscript">function compose(f:Function, g:Function):Function {
return function(x:Object) {return f(g(x));};
}
function test() {
trace(compose(Math.atan, Math.tan)(0.5));
}</langsyntaxhighlight>
 
=={{header|Ada}}==
The interface of a generic functions package. The package can be instantiated with any type that has value semantics. Functions are composed using the operation '*'. The same operation applied to an argument evaluates it there: f * x. Functions can be composed with pointers to [[Ada]] functions. (In [[Ada]] functions are not first-class):
<langsyntaxhighlight lang="ada">generic
type Argument is private;
package Functions is
Line 30 ⟶ 52:
private
type Func is array (Positive range <>) of Primitive_Operation;
end Functions;</langsyntaxhighlight>
Here is an implementation;
<langsyntaxhighlight lang="ada">package body Functions is
function "*" (Left : Func; Right : Argument) return Argument is
Result : Argument := Right;
Line 56 ⟶ 78:
return (Left, Right);
end "*";
end Functions;</langsyntaxhighlight>
The following is an example of use:
<langsyntaxhighlight lang="ada">with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
with Ada.Text_IO; use Ada.Text_IO;
with Functions;
Line 69 ⟶ 91:
begin
Put_Line (Float'Image (Sin_Arcsin * 0.5));
end Test_Compose;</langsyntaxhighlight>
{{out}}
Sample output:
<pre>
5.00000E-01
</pre>
 
=={{header|Agda}}==
<syntaxhighlight lang="agda">compose : ∀ {a b c} {A : Set a} {B : Set b} {C : Set c}
→ (B → C)
→ (A → B)
→ A → C
compose f g x = f (g x)</syntaxhighlight>
 
=={{header|Aikido}}==
<langsyntaxhighlight lang="aikido">
import math
 
Line 86 ⟶ 115:
println (func(0.5)) // 0.5
 
</syntaxhighlight>
</lang>
 
=={{header|Aime}}==
<syntaxhighlight lang="aime">compose_i(,,)
{
($0)(($1)($2));
}
 
compose(,)
{
compose_i.apply($0, $1);
}
 
double(real a)
{
2 * a;
}
 
square(real a)
{
a * a;
}
 
main(void)
{
o_(compose(square, double)(40), "\n");
 
0;
}</syntaxhighlight>
{{Out}}
<pre>6400</pre>
 
=={{header|ALGOL 68}}==
Line 95 ⟶ 154:
violates standard '''ALGOL 68''''s scoping rules. [[ALGOL 68G]] warns about this during
parsing, and then rejects during runtime.
<langsyntaxhighlight lang="algol68">MODE F = PROC(REAL)REAL; # ALGOL 68 is strong typed #
 
# As a procedure for real to real functions #
Line 104 ⟶ 163:
# Example use: #
F sin arc sin = compose(sin, arc sin);
print((sin arc sin(0.5), (sin O arc sin)(0.5), new line))</langsyntaxhighlight>
{{out}}
Output:
<pre>
+.500000000000000e +0 +.500000000000000e +0
Line 113 ⟶ 172:
{{works with|ALGOL 68|Standard - Jan 1975 Boston SC allowed Partial Parametrization. }}
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386}}
<langsyntaxhighlight lang="algol68">MODE F = PROC(REAL)REAL; # ALGOL 68 is strong typed #
 
# As a procedure for real to real functions #
Line 123 ⟶ 182:
# Example use: #
F sin arc sin = compose(sin, arc sin);
print((sin arc sin(0.5), (sin O arc sin)(0.5), new line))</langsyntaxhighlight>
 
=={{header|Amazing Hopper}}==
VERSION 1:
<syntaxhighlight lang="c">
#defn Compose(_FX_,_FY_) _FX_,_FY_
 
main:
0.5,Compose(sin,arcsin)
"\n", print
{0}return
</syntaxhighlight>
{{out}}
<pre>
$ hopper3 basica/compose1.hop
0.500000
 
</pre>
VERSION 2:
<syntaxhighlight lang="c">
#define-a «(_X_) _X_ )
#define Compose(_FX_,_FY_) _FC_(_FX_,_FY_,
#define _FC_(_X_,_Y_,*) *,_X_,_Y_
 
main:
Compose(sin,arcsin)«( 0.5)
"\n", print
{0}return
</syntaxhighlight>
{{out}}
<pre>
$ hopper3 basica/compose2.hop
0.500000
 
</pre>
 
VERSION 3:
<syntaxhighlight lang="c">
#define «(_X_) _X_ )
#define Compose(_FX_,_FY_) _FC_(_FX_,_FY_,
#define _FC_(_X_,_Y_,*) *,_X_,_Y_
 
main:
Compose(sin,arcsin)«( 0.5, mul by '2' )
"\n", print
{0}return
</syntaxhighlight>
{{out}}
<pre>
$ hopper3 basica/compose2.hop
1.000000
 
</pre>
<p>The power of macro-substitution, by Hopper!</p>
 
=={{header|AntLang}}==
<syntaxhighlight lang="antlang">/Apply g to exactly one argument
compose1: {f: x; g: y; {f[g[x]]}}
/Extra: apply to multiple arguments
compose: {f: x; g: y; {f[g apply args]}}</syntaxhighlight>
 
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">-- Compose two functions where each function is
-- a script object with a call(x) handler.
on compose(f, g)
script
on call(x)
f's call(g's call(x))
end call
end script
end compose
 
script sqrt
on call(x)
x ^ 0.5
end call
end script
 
script twice
on call(x)
2 * x
end call
end script
 
compose(sqrt, twice)'s call(32)
-- Result: 8.0</syntaxhighlight>
 
A limitation of AppleScript's handlers (functions), which can be seen in the example above, is that they are not in themselves composable first class objects, and have to be lifted into script objects before they can be composed or passed as arguments.
 
We can generalise this lifting with an '''mReturn''' or '''mInject''' function, which injects a handler into a script for us. This allows use to write higher-order composition and pipelining functions which take a pair (or sequence of) ordinary handlers as arguments, and return a first class script object. (We can also use mReturn to equip AppleScript with '''map''' and '''fold''' functions which take a list and an ordinary handler as arguments).
 
<syntaxhighlight lang="applescript">------------ COMPOSITION OF A LIST OF FUNCTIONS ----------
 
-- compose :: [(a -> a)] -> (a -> a)
on compose(fs)
script
on |λ|(x)
script go
on |λ|(a, f)
mReturn(f)'s |λ|(a)
end |λ|
end script
foldr(go, x, fs)
end |λ|
end script
end compose
 
 
--------------------------- TEST -------------------------
on root(x)
x ^ 0.5
end root
 
on succ(x)
x + 1
end succ
 
on half(x)
x / 2
end half
 
on run
tell compose({half, succ, root})
|λ|(5)
end tell
--> 1.61803398875
end run
 
 
-------------------- GENERIC FUNCTIONS -------------------
 
-- foldr :: (a -> b -> a) -> a -> [b] -> a
on foldr(f, startValue, xs)
tell mReturn(f)
set v to startValue
set lng to length of xs
repeat with i from lng to 1 by -1
set v to |λ|(v, item i of xs, i, xs)
end repeat
return v
end tell
end foldr
 
-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: Handler -> Script
on mReturn(f)
if class of f is script then
f
else
script
property |λ| : f
end script
end if
end mReturn</syntaxhighlight>
{{Out}}
<pre>1.61803398875</pre>
 
=={{header|Applesoft BASIC}}==
<syntaxhighlight lang="applesoftbasic">10 F$ = "SIN"
20 DEF FN A(P) = ATN(P/SQR(-P*P+1))
30 G$ = "FN A"
40 GOSUB 100"COMPOSE
50 SA$ = E$
 
60 X = .5 : E$ = SA$
70 GOSUB 200"EXEC
80 PRINT R
90 END
 
100 E$ = F$ + "(" + G$ + "(X))" : RETURN : REMCOMPOSE F$ G$
 
200 D$ = CHR$(4) : FI$ = "TEMPORARY.EX" : M$ = CHR$(13)
210 PRINT D$"OPEN"FI$M$D$"CLOSE"FI$M$D$"DELETE"FI$
220 PRINT D$"OPEN"FI$M$D$"WRITE"FI$
230 PRINT "CALL-998:CALL-958:R="E$":CONT"
240 PRINT D$"CLOSE"FI$M$D$"EXEC"FI$:CALL-998:END:RETURN</syntaxhighlight>
 
=={{header|Argile}}==
Only works for functions taking real and returning real (double precision, 64 bits)
{{works with|Argile|1.0.0}}
<langsyntaxhighlight Argilelang="argile">use std, math
 
let my_asin = new Function (.:<any,real x>:. -> real {asin x})
Line 170 ⟶ 407:
f.func = func
f.data = data
f</langsyntaxhighlight>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">compose: function [f,g] ->
return function [x].import:[f,g][
call f @[call g @[x]]
]
 
splitupper: compose 'split 'upper
 
print call 'splitupper ["done"]</syntaxhighlight>
 
{{out}}
 
<pre>D O N E</pre>
 
=={{header|ATS}}==
 
If I may state in greater detail what the task requires, it is this:
 
That '''compose''' should return ''a new function'', which will exist independently of '''compose''' once created. A person should never have to call '''compose''' merely to get the result of the composed computation.
 
Thus it is probably impossible, for instance, to ''really'' satisfy the requirement in standard C, if the result of composition is to be called like an ordinary function. However, [[#C|the C solution]] shows it is possible, ''if'' the notion of a function is expanded to include structures requiring more than just a plain C function call. Also, there is at least one platform-dependent library for creating a "true" closure in C.
 
In ATS we have closures, but of more than one kind.
 
<syntaxhighlight lang="ats">(*
The task:
 
Create a function, compose, whose two arguments f and g, are
both functions with one argument.
 
The result of compose is to be a function of one argument,
(let's call the argument x), which works like applying function
f to the result of applying function g to x.
 
In ATS, we have to choose whether to use non-linear closures
(cloref) or linear closures (cloptr). In the latter case, we also
have to choose between closures allocated with malloc (or similar)
and closures allocated on the stack.
 
For simplicity, we will use non-linear closures and assume there is
a garbage collector, or that the memory allocated for the closures
can be allowed to leak. (This is often the case in a program that
does not run continuously.)
*)
 
#include "share/atspre_staload.hats"
 
(* The following is actually a *template function*, rather than a
function proper. It is expanded during template processing. *)
 
fn {t1, t2, t3 : t@ype}
compose (f : t2 -<cloref1> t3,
g : t1 -<cloref1> t2) : t1 -<cloref1> t3 =
lam x => f (g (x))
 
 
implement
main0 () =
let
val one_hundred = 100.0
val char_zero = '0'
val f = (lam y =<cloref1> add_double_int (one_hundred, y))
val g = (lam x =<cloref1> char2i x - char2i char_zero)
val z = compose (f, g) ('5')
val fg = compose (f, g)
val w = fg ('7')
in
println! (z : double);
println! (w : double)
end</syntaxhighlight>
 
{{out}}
<pre>$ patscc -O2 -DATS_MEMALLOC_GCBDW function_composition.dats -lgc && ./a.out
105.000000
107.000000</pre>
 
Incidentally, it is possible to instantiate the template function and obtain a true function that does the composition. What the template does for us is give us compile-time type polymorphism. In the following, the template is instantiated as a true function for specific types:
 
<syntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
fn {t1, t2, t3 : t@ype}
compose (f : t2 -<cloref1> t3,
g : t1 -<cloref1> t2) : t1 -<cloref1> t3 =
lam x => f (g (x))
 
fn
compose_char2int2double
(f : int -<cloref1> double,
g : char -<cloref1> int) :
char -<cloref1> double =
compose<char, int, double> (f, g)
 
implement
main0 () =
let
val one_hundred = 100.0
val char_zero = '0'
val f = (lam y =<cloref1> add_double_int (one_hundred, y))
val g = (lam x =<cloref1> char2i x - char2i char_zero)
val z = compose_char2int2double (f, g) ('5')
val fg = compose_char2int2double (f, g)
val w = fg ('7')
in
println! (z : double);
println! (w : double)
end</syntaxhighlight>
 
{{out}}
<pre>$ patscc -O2 -DATS_MEMALLOC_GCBDW function_composition_2.dats -lgc && ./a.out
105.000000
107.000000</pre>
 
One could even make the composition procedures themselves be closures:
 
<syntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
fn {t1, t2, t3 : t@ype}
compose (f : t2 -<cloref1> t3,
g : t1 -<cloref1> t2) :<cloref1>
t1 -<cloref1> t3 =
lam x => f (g (x))
 
fn
compose_char2int2double
(f : int -<cloref1> double,
g : char -<cloref1> int) :<cloref1>
char -<cloref1> double =
compose<char, int, double> (f, g)
 
implement
main0 () =
let
val one_hundred = 100.0
val char_zero = '0'
val f = (lam y =<cloref1> add_double_int (one_hundred, y))
val g = (lam x =<cloref1> char2i x - char2i char_zero)
val z = compose_char2int2double (f, g) ('5')
val fg = compose_char2int2double (f, g)
val w = fg ('7')
in
println! (z : double);
println! (w : double)
end</syntaxhighlight>
 
{{out}}
<pre>$ patscc -O2 -DATS_MEMALLOC_GCBDW function_composition_3.dats -lgc && ./a.out
105.000000
107.000000</pre>
 
=={{header|AutoHotkey}}==
contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276379.html#276379 forum]
<langsyntaxhighlight AutoHotkeylang="autohotkey">MsgBox % compose("sin","cos",1.5)
 
compose(f,g,x) { ; function composition
Return %f%(%g%(x))
}</syntaxhighlight>
}</lang>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<syntaxhighlight lang="bbcbasic"> REM Create some functions for testing:
DEF FNsqr(a) = SQR(a)
DEF FNabs(a) = ABS(a)
REM Create the function composition:
SqrAbs = FNcompose(FNsqr(), FNabs())
REM Test calling the composition:
x = -2 : PRINT ; x, FN(SqrAbs)(x)
END
DEF FNcompose(RETURN f%, RETURN g%)
LOCAL f$, p% : DIM p% 7 : p%!0 = f% : p%!4 = g%
f$ = "(x)=" + CHR$&A4 + "(&" + STR$~p% + ")(" + \
\ CHR$&A4 + "(&" + STR$~(p%+4) + ")(x))"
DIM p% LEN(f$) + 4 : $(p%+4) = f$ : !p% = p%+4
= p%</syntaxhighlight>
{{out}}
<pre>
-2 1.41421356
</pre>
 
=={{header|Bori}}==
<syntaxhighlight lang="bori">double sin (double v) { return Math.sin(v); }
double asin (double v) { return Math.asin(v); }
Var compose (Func f, Func g, double d) { return f(g(d)); }
 
void button1_onClick (Widget widget)
{
double d = compose(sin, asin, 0.5);
label1.setText(d.toString(9));
}</syntaxhighlight>
{{out}} on Android phone:
<syntaxhighlight lang="bori">0.500000000</syntaxhighlight>
 
=={{header|Binary Lambda Calculus}}==
 
In lambda calculus, the compose functions happens to coincide with multiplication on Church numerals, namely <code>compose = \f \g \x. f (g x)</code> which in BLC is
 
<pre>00 00 00 01 1110 01 110 10</pre>
 
=={{header|BQN}}==
 
As a 2-modifier:
 
<syntaxhighlight lang="bqn">_compose_ ← ∘</syntaxhighlight>
 
Or:
 
<syntaxhighlight lang="bqn">_compose_ ← {𝔽𝔾𝕩}</syntaxhighlight>
 
As a dyadic function:
 
<syntaxhighlight lang="bqn">Compose ← {𝕏∘𝕎}</syntaxhighlight>
 
This is how you can use it:
 
<pre>
(Compose´ ⟨-,÷⟩) {𝕎𝕩} 2
¯0.5
</pre>
 
=={{header|Bracmat}}==
 
This solution uses a macro in the body of the <code>compose</code> function.
 
Function composition is illustrated with a conversion from Fahrenheit to Celsius in two steps, followed by a conversion of the resulting rational number to a floating point expression. This shows that the returned value from the <code>compose</code> function indeed is a function and can be used as an argument to another call to <code>compose</code>.
 
<syntaxhighlight lang="bracmat">( ( compose
= f g
. !arg:(?f.?g)&'(.($f)$(($g)$!arg))
)
& compose
$ ( (=.flt$(!arg,2))
. compose$((=.!arg*5/9).(=.!arg+-32))
)
: (=?FahrenheitToCelsius)
& ( FahrenheitToCelsiusExample
= deg
. chu$(x2d$b0):?deg
& out
$ ( str
$ (!arg " " !deg "F in " !deg "C = " FahrenheitToCelsius$!arg)
)
)
& FahrenheitToCelsiusExample$0
& FahrenheitToCelsiusExample$100
)</syntaxhighlight>
 
<pre>0 °F in °C = -1,78*10E1
100 °F in °C = 3,78*10E1</pre>
 
=={{header|Brat}}==
<langsyntaxhighlight lang="brat">compose = { f, g | { x | f g x } }
#Test
Line 188 ⟶ 668:
double = { x | x * 2 }
b = compose(->double ->add1)
p b 1 #should print 4</langsyntaxhighlight>
 
=={{header|Bruijn}}==
Composition operators as defined in <code>std/Combinator</code>:
<syntaxhighlight lang="bruijn">
:import std/Number .
 
# 1x composition, bluebird combinator
…∘… [[[2 (1 0)]]]
 
:test (((inc ∘ (mul (+2))) (+3)) =? (+7)) ([[1]])
 
# 2x composition, blackbird combinator
…∘∘… [[[[3 (2 1 0)]]]]
 
:test (((inc ∘∘ mul) (+2) (+3)) =? (+7)) ([[1]])
 
# 3x composition, bunting combinator
…∘∘∘… [[[[[4 (3 2 1 0)]]]]]
 
:test (((inc ∘∘∘ (add ∘∘ mul)) (+1) (+2) (+4)) =? (+7)) ([[1]])
 
# reverse composition, queer bird combinator
…→… [[[1 (2 0)]]]
 
:test ((((mul (+2)) → inc) (+3)) =? (+7)) ([[1]])
</syntaxhighlight>
 
=={{header|C}}==
Only works for functions taking a double and returning a double:
<langsyntaxhighlight lang="c">#include <stdlib.h>
 
/* generic interface for functors from double to double */
Line 255 ⟶ 761:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<syntaxhighlight lang="csharp">using System;
class Program
{
static void Main(string[] args)
{
Func<int, int> outfunc = Composer<int, int, int>.Compose(functA, functB);
Console.WriteLine(outfunc(5)); //Prints 100
}
static int functA(int i) { return i * 10; }
static int functB(int i) { return i + 5; }
class Composer<A, B, C>
{
public static Func<C, A> Compose(Func<B, A> a, Func<C, B> b)
{
return delegate(C i) { return a(b(i)); };
}
}
}</syntaxhighlight>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <functional>
Note: this is already implemented as <code>__gnu_cxx::compose1()</code>
<lang cpp>#include <functional>
#include <cmath>
#include <iostream>
Line 293 ⟶ 818:
 
return 0;
}</langsyntaxhighlight>
 
{{works with|C++11}} composing <code>std::function</code>
=={{header|C sharp|C#}}==
<syntaxhighlight lang="cpp">#include <iostream>
<lang csharp>using System;
#include <functional>
class Program
#include <cmath>
{
 
static void Main(string[] args)
template <typename A, typename B, typename C>
{
std::function<C(A)> compose(std::function<C(B)> f, std::function<B(A)> g) {
Func<int, int> outfunc = Composer<int, int, int>.Compose(functA, functB);
return [f,g](A x) { return f(g(x)); };
Console.WriteLine(outfunc(5)); //Prints 100
}
}
 
static int functA(int i) { return i * 10; }
int main() {
static int functB(int i) { return i + 5; }
std::function<double(double)> f = sin;
class Composer<A, B, C>
std::function<double(double)> g = asin;
{
std::cout << compose(f, g)(0.5) << std::endl;
public static Func<C, A> Compose(Func<B, A> a, Func<C, B> b)
}</syntaxhighlight>
{
 
return delegate(C i) { return a(b(i)); };
{{Works with|C++14}}
}
This much simpler version uses <code>decltype(auto)</code>.
}
<syntaxhighlight lang="cpp">#include <iostream>
}</lang>
#include <cmath>
template <class F, class G>
decltype(auto) compose(F&& f, G&& g) {
return [=](auto x) { return f(g(x)); };
}
int main() {
std::cout << compose(sin, asin)(0.5) << "\n";
}</syntaxhighlight>
 
{{works with|GCC}} Not standard C++, but GCC has a built-in compose function
<syntaxhighlight lang="cpp">#include <iostream>
#include <cmath>
#include <ext/functional>
 
int main() {
std::cout << __gnu_cxx::compose1(std::ptr_fun(::sin), std::ptr_fun(::asin))(0.5) << std::endl;
}</syntaxhighlight>
 
'''Works with:''' C++20
<syntaxhighlight lang="cpp">#include <iostream>
#include <cmath>
auto compose(auto f, auto g) {
return [=](auto x) { return f(g(x)); };
}
 
int main() {
std::cout << compose(sin, asin)(0.5) << "\n";
}
</syntaxhighlight>
{{out}}
<pre>
0.5</pre>
 
=={{header|Clojure}}==
Line 319 ⟶ 879:
 
A manual implementation could look like this:
<langsyntaxhighlight lang="clojure">(defn compose [f g]
(fn [x]
(f (g x))))
Line 325 ⟶ 885:
; Example
(def inc2 (compose inc inc))
(println (inc2 5)) ; prints 7</langsyntaxhighlight>
 
=={{header|CoffeeScript}}==
<syntaxhighlight lang="coffeescript">
compose = ( f, g ) -> ( x ) -> f g x
 
# Example
add2 = ( x ) -> x + 2
mul2 = ( x ) -> x * 2
 
mulFirst = compose add2, mul2
addFirst = compose mul2, add2
multiple = compose mul2, compose add2, mul2
 
console.log "add2 2 #=> #{ add2 2 }"
console.log "mul2 2 #=> #{ mul2 2 }"
console.log "mulFirst 2 #=> #{ mulFirst 2 }"
console.log "addFirst 2 #=> #{ addFirst 2 }"
console.log "multiple 2 #=> #{ multiple 2 }"
</syntaxhighlight>
 
{{out}}
<pre>
add2 2 #=> 4
mul2 2 #=> 4
mulFirst 2 #=> 6
addFirst 2 #=> 8
multiple 2 #=> 12
</pre>
 
Or, extending the <code>Function</code> prototype.
 
<syntaxhighlight lang="coffeescript">
Function::of = (f) -> (args...) => @ f args...
 
# Example
add2 = (x) -> x + 2
mul2 = (x) -> x * 2
 
mulFirst = add2.of mul2
addFirst = mul2.of add2
multiple = mul2.of add2.of mul2
 
console.log "add2 2 #=> #{ add2 2 }"
console.log "mul2 2 #=> #{ mul2 2 }"
console.log "mulFirst 2 #=> #{ mulFirst 2 }"
console.log "addFirst 2 #=> #{ addFirst 2 }"
console.log "multiple 2 #=> #{ multiple 2 }"
</syntaxhighlight>
 
Output is identical.
 
=={{header|Common Lisp}}==
<code>compose</code> returns a function that closes on the lexical variables f and g.
<langsyntaxhighlight lang="lisp">(defun compose (f g) (lambda (x) (funcall f (funcall g x))))</langsyntaxhighlight>
 
Example use:
<langsyntaxhighlight lang="lisp">>(defun compose (f g) (lambda (x) (funcall f (funcall g x))))
COMPOSE
>(let ((sin-asin (compose #'sin #'asin))))
(funcall sin-asin 0.5))
0.5</langsyntaxhighlight>
 
This alternate solution, more ugly and more difficult, never closes on any lexical variables. Instead, it uses [[runtime evaluation]] to insert the values of f and g into new code. This is just a different way to create a closure.
 
<syntaxhighlight lang="lisp">(defun compose (f g)
(eval `(lambda (x) (funcall ',f (funcall ',g x)))))</syntaxhighlight>
 
----
This alternate solution, more ugly and more difficult, never closes on any lexical variables. Instead, it uses [[runtime evaluation]] to insert the values of f and g into new code. This is just a different way to create a closure.
 
In this last example, a macro is used to compose any number of single parameter functions.
{{trans|PicoLisp}}
<langsyntaxhighlight lang="lisp">CL-USER> (defundefmacro compose (ffn-name &rest gargs)
(labels ((rec1 (args)
(eval `(lambda (x) (funcall ',f (funcall ',g x))))</lang>
(if (= (length args) 1)
`(funcall ,@args x)
`(funcall ,(first args) ,(rec1 (rest args))))))
`(defun ,fn-name (x) ,(rec1 args))))</syntaxhighlight>
Because this macro expands into a defun form, the function returned by compose is in the function namespace and the use of funcall is not necessary.
<pre>CL-USER> (compose f #'ceiling #'sin #'sqrt)
F
CL-USER> (compose g #'1+ #'abs #'cos)
G
CL-USER> (compose h #'f #'g)
H
CL-USER> (values (f pi) (g pi) (h pi))
1
2.0L0
1
CL-USER> </pre>
 
=={{header|Crystal}}==
Crystal requires using closures for function composition. Since the only type the compiler can't infer for <code>compose</code> is the type of <code>x</code>, the type of the first argument to <code>f</code> has to be specified as the generic type <code>T</code>.
<syntaxhighlight lang="ruby">require "math"
 
def compose(f : Proc(T, _), g : Proc(_, _)) forall T
return ->(x : T) { f.call(g.call(x)) }
end
 
compose(->Math.sin(Float64), ->Math.asin(Float64)).call(0.5) #=> 0.5</syntaxhighlight>
The types for <code>f</code>'s output, <code>g</code>'s input and output, and the result of <code>compose</code> can all be inferred, but could be specified verbosely with <code>def compose(f : Proc(T, U), g : Proc(U, V)) : Proc(T, V) forall T, U, V</code>
 
=={{header|D}}==
<syntaxhighlight lang="d">import std.stdio;
'''D 2.0 version''' of compose function (template).
<lang D>import std.stdio;
import std.math;
 
T delegate(S) compose(T, U, S)(in T delegate(U) f, U delegate(S) g) {
in U delegate(S) g) {
return (S s) { return f(g(s)); };
return s => f(g(s));
}</lang>
}
 
void main() {
Compose working both in D 1.0 and 2.0:
<lang D>T delegate(S) writeln(compose(T,(int x) => x + U15, S)(Tint delegate(Ux) f,=> Ux delegate^^ 2)(S10) g) {;
writeln(compose((int x) => x ^^ 2, (int x) => x + 15)(10));
struct Wrapper {
}</syntaxhighlight>
typeof(f) fcp;
{{out}}
typeof(g) gcp;
<pre>115
T foobar(S s) { return fcp(gcp(s)); }
625</pre>
}
Wrapper* hold = new Wrapper;
hold.fcp = f;
hold.gcp = g;
return &hold.foobar;
}</lang>
 
=={{header|Delphi}}==
Line 372 ⟶ 1,006:
Anonymous methods were introduced in Delphi 2009, so next code works with Delphi 2009 and above:
 
<langsyntaxhighlight Delphilang="delphi">program AnonCompose;
 
{$APPTYPE CONSOLE}
Line 378 ⟶ 1,012:
type
TFunc = reference to function(Value: Integer): Integer;
// Alternative: TFunc = TFunc<Integer,Integer>;
 
function Compose(F, G: TFunc): TFunc;
Line 407 ⟶ 1,042:
Writeln(Func3(6)); // 36 = 6 * 3 * 2
Readln;
end.</langsyntaxhighlight>
 
=={{header|Diego}}==
Function composition of two simple functions:
<syntaxhighlight lang="diego">set_namespace(rosettacode);
 
begin_funct(compose)_arg(f, g);
[]_ret(x)_calc([f]([g]([x])));
end_funct[];
 
me_msg()_funct(compose)_arg(f)_sin()_arg(g)_asin()_var(x)_value(0.5); // result: 0.5
 
reset_namespace[];</syntaxhighlight>
 
Function composition of two calculated functions:
<syntaxhighlight lang="diego">set_namespace(rosettacode);
 
with_funct(f)_arg({int}, x)_ret()_calc([x] * [x]);
with_funct(g)_arg({int}, x)_ret()_calc([x] + 2);
 
begin_funct(compose)_arg(f, g);
[]_ret(x)_calc([f]([g]([x])));
end_funct[];
 
me_msg()_funct(compose)_arg(f)_funct(f)_arg(g)_funct(g)_var(x)_v(10); // result: 144
// or me_msg()_funct(compose)_arg({f}, f)_arg({g}, g)_var(x)_v(10);
 
reset_ns[];</syntaxhighlight>
 
=={{header|Dylan}}==
 
compose[https://opendylan.org/books/drm/Functional_Operations#compose] is already part of the language standard, with a more complete definition than this.
<lang dylan>define method compose(f,g)
 
<syntaxhighlight lang="dylan">
define method compose(f,g)
method(x) f(g(x)) end
end;</lang>
</syntaxhighlight>
 
=={{header|Déjà Vu}}==
It is already defined in the standard library as <code>$</code>.
 
<syntaxhighlight lang="dejavu">compose f g:
labda:
f g</syntaxhighlight>
 
=={{header|E}}==
 
<langsyntaxhighlight lang="e">def compose(f, g) {
return fn x { return f(g(x)) }
}</langsyntaxhighlight>
 
=={{header|EchoLisp}}==
<syntaxhighlight lang="lisp">
;; By decreasing order of performance
;; 1) user definition : lambda and closure
 
(define (ucompose f g ) (lambda (x) ( f ( g x))))
(ucompose sin cos)
→ (🔒 λ (_x) (f (g _x)))
 
;; 2) built-in compose : lambda
 
(compose sin cos)
→ (λ (_#:g1002) (#apply-compose (#list #cos #sin) _#:g1002))
 
;; 3) compiled composition
 
(define (sincos x) (sin (cos x)))
sincos → (λ (_x) (⭕️ #sin (#cos _x)))
</syntaxhighlight>
{{out}}
<syntaxhighlight lang="lisp">
((ucompose sin cos) 3) → -0.8360218615377305
((compose sin cos) 3) → -0.8360218615377305
(sincos 3) → -0.8360218615377305
</syntaxhighlight>
 
=={{header|Ela}}==
It is already defined in standard prelude as (<<) operator.
 
<syntaxhighlight lang="ela">let compose f g x = f (g x)</syntaxhighlight> =={{header|Ela}}==
It is already defined in standard prelude as (<<) operator.
 
<syntaxhighlight lang="ela">compose f g x = f (g x)</syntaxhighlight>
 
=={{header|Elena}}==
ELENA 6.x :
<syntaxhighlight lang="elena">import extensions;
extension op : Func1
{
compose(Func1 f)
= (x => self(f(x)));
}
public program()
{
var fg := (x => x + 1).compose::(x => x * x);
console.printLine(fg(3))
}</syntaxhighlight>
{{out}}
<pre>
10
</pre>
 
=={{header|Elixir}}==
{{trans|Erlang}}
<syntaxhighlight lang="elixir">defmodule RC do
def compose(f, g), do: fn(x) -> f.(g.(x)) end
def multicompose(fs), do: List.foldl(fs, fn(x) -> x end, &compose/2)
end
 
sin_asin = RC.compose(&:math.sin/1, &:math.asin/1)
IO.puts sin_asin.(0.5)
 
IO.puts RC.multicompose([&:math.sin/1, &:math.asin/1, fn x->1/x end]).(0.5)
IO.puts RC.multicompose([&(&1*&1), &(1/&1), &(&1*&1)]).(0.5)</syntaxhighlight>
 
{{out}}
<pre>
0.5
2.0
16.0
</pre>
 
=={{header|Emacs Lisp}}==
 
Lexical binding is supported as of Emacs 24.1, allowing the use of a closure for function composition.
 
<syntaxhighlight lang="lisp">;; lexical-binding: t
(defun compose (f g)
(lambda (x)
(funcall f (funcall g x))))
 
(let ((func (compose '1+ '1+)))
(funcall func 5)) ;=> 7</syntaxhighlight>
 
Alternatively, a <code>lambda</code> form can be constructed with the desired <code>f</code> and <code>g</code> inserted. The result is simply a list. A list starting with <code>lambda</code> is a function.
 
<syntaxhighlight lang="lisp">(defun compose (f g)
`(lambda (x) (,f (,g x))))
 
(let ((func (compose '1+ '1+)))
(funcall func 5)) ;=> 7</syntaxhighlight>
 
A similar thing can be done with a macro like the following. It differs in that the arguments should be unquoted symbols, and if they're expressions then they're evaluated on every call to the resulting <code>lambda</code>.
 
<syntaxhighlight lang="lisp">(defmacro compose (f g)
`(lambda (x) (,f (,g x))))
 
(let ((func (compose 1+ 1+)))
(funcall func 5)) ;=> 7</syntaxhighlight>
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">-module(fn).
-export([compose/12, multicompose/21]).
 
compose(F,G) -> fun(X) -> F(G(X)) end.
 
multicompose(Fs) ->
lists:foldl(fun compose/2, fun(X) -> X end, Fs).</langsyntaxhighlight>
 
Using them:
<langsyntaxhighlight lang="erlang">1> (fn:compose(fun math:sin/1, fun math:asin/1))(0.5).
0.5
2> Sin_asin_plus1 = fn:multicompose([fun math:sin/1, fun math:asin/1, fun(X) -> X + 1 end]).
#Fun<tests.0.59446746>
82> Sin_asin_plus1(0.5).
1.5</langsyntaxhighlight>
 
{{omit from|Euphoria}}
Line 446 ⟶ 1,223:
 
We can implement composition manually like this (F# Interactive session):
<langsyntaxhighlight lang="fsharp">> let compose f g x = f (g x);;
 
val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b</langsyntaxhighlight>
Usage:
<langsyntaxhighlight lang="fsharp">> let sin_asin = compose sin asin;;
 
val sin_asin : (float -> float)
 
> sin_asin 0.5;;
val it : float = 0.5</langsyntaxhighlight>
 
=={{header|Factor}}==
Factor is a concatenative language, so function composition is inherent. If the functions <code>f</code> and <code>g</code> are named, their composition is <code>f g</code>. Thanks to stack polymorphism, this holds true even if <code>g</code> consumes more values than <code>f</code> leaves behind. You always get every sort of composition for free. But watch out for stack underflows!
When passing functions around and creating anonymous functions, Factor uses so called quotations. There is already a word (<code>compose</code>) that provides composition of quotations.
 
<lang factor>( scratchpad ) [ 2 * ] [ 1 + ] compose .
To compose quotations (anonymous functions), <code>compose</code> may be used:
 
<syntaxhighlight lang="factor">( scratchpad ) [ 2 * ] [ 1 + ] compose .
[ 2 * 1 + ]
( scratchpad ) 4 [ 2 * ] [ 1 + ] compose call .
9</langsyntaxhighlight>
 
=={{header|Fantom}}==
<langsyntaxhighlight lang="fantom">
class Compose
{
Line 481 ⟶ 1,261:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: compose ( xt1 xt2 -- xt3 )
>r >r :noname
r> compile,
Line 492 ⟶ 1,272:
 
' 2* ' 1+ compose ( xt )
3 swap execute . \ 7</langsyntaxhighlight>
 
=={{header|Fortran}}==
Modern Fortran standard has (limited) kind of higher-order functions (as result, argument, and with one level of nested functions) and optional arguments, and this enables to compose the following function (it is impure because Fortran ''has no closures''). For simple cases function calls may be just nested to achieve the effect of function composition, because in fortran nested calls f(g(d(x))) generate a hierarchic set of function calls and the result of each function is transmitted to its calling function in a standard way for all functions.
 
<syntaxhighlight lang="fortran">
module functions_module
implicit none
private ! all by default
public :: f,g
 
contains
 
pure function f(x)
implicit none
real, intent(in) :: x
real :: f
f = sin(x)
end function f
 
pure function g(x)
implicit none
real, intent(in) :: x
real :: g
g = cos(x)
end function g
 
end module functions_module
 
module compose_module
implicit none
private ! all by default
public :: compose
 
interface
pure function f(x)
implicit none
real, intent(in) :: x
real :: f
end function f
 
pure function g(x)
implicit none
real, intent(in) :: x
real :: g
end function g
end interface
 
contains
 
impure function compose(x, fi, gi)
implicit none
real, intent(in) :: x
procedure(f), optional :: fi
procedure(g), optional :: gi
real :: compose
 
procedure (f), pointer, save :: fpi => null()
procedure (g), pointer, save :: gpi => null()
 
if(present(fi) .and. present(gi))then
fpi => fi
gpi => gi
compose = 0
return
endif
 
if(.not. associated(fpi)) error stop "fpi"
if(.not. associated(gpi)) error stop "gpi"
 
compose = fpi(gpi(x))
 
contains
 
end function compose
 
end module compose_module
 
program test_compose
use functions_module
use compose_module
implicit none
write(*,*) "prepare compose:", compose(0.0, f,g)
write(*,*) "run compose:", compose(0.5)
end program test_compose
</syntaxhighlight>
 
=={{header|Fortress}}==
In Fortress, there are two ways that you can compose functions.
 
1. You can compose functions manually by writing your own composition function.
 
In this version, we allow any type of function to be used by defining our own types in the function definition and using those types to define how the composed function should behave. This version operates very similarly to the way that the COMPOSE operator, explained below, operates.
 
<syntaxhighlight lang="fortress">
compose[\A, B, C\](f:A->B, g:B->C, i:Any): A->C = do
f(g(i))
end
 
composed(i:RR64): RR64 = compose(sin, cos, i)
</syntaxhighlight>
 
Alternatively, you could explicitly define each type for improved type safety.
 
Due to the fact that alt_compose() is built around the idea that it is being used to compose two trigonometric functions, these will return identical functions. However, if you were to pass alt_composed() any other type of function, the interpreter would throw an error.
<syntaxhighlight lang="fortress">
alt_compose(f:Number->RR64, g:Number->RR64, i:RR64): ()->RR64 = do
f(g(i))
end
 
alt_composed(i:RR64): RR64 = compose(sin, cos, i)
</syntaxhighlight>
 
2. You can use the COMPOSE operator (or CIRC or RING). Because COMPOSE returns an anonymous function, it is necessary to wrap it in parentheses if you want to be able to use it in this manner.
 
<syntaxhighlight lang="fortress">
opr_composed(i:Number): Number->RR64 = (sin COMPOSE cos)(i)
</syntaxhighlight>
 
Should you need to, you could also mix both methods by overloading the COMPOSE operator.
 
=={{header|FreeBASIC}}==
Illustrating with functions that take and return integers.
<syntaxhighlight lang="freebasic">function compose( f as function(as integer) as integer,_
g as function(as integer) as integer,_
n as integer ) as integer
return f(g(n))
end function</syntaxhighlight>
If you have functions named, say, foo and bar you would call compose with
<pre>compose( @foo, @bar, n )</pre> for some integer n.
 
=={{header|FunL}}==
<syntaxhighlight lang="funl">import math.{sin, asin}
 
def compose( f, g ) = x -> f( g(x) )
 
sin_asin = compose( sin, asin )
 
println( sin_asin(0.5) )</syntaxhighlight>
 
{{out}}
 
<pre>
0.5
</pre>
 
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/Function_composition}}
 
'''Solution'''
 
[[File:Fōrmulæ - Function composition 01.png]]
 
The compose function returns a lambda expression, containing the actual composition of its arguments, and hence it can be called applied with its argument(s):
 
'''Test cases'''
 
[[File:Fōrmulæ - Function composition 02.png]]
 
[[File:Fōrmulæ - Function composition 03.png]]
 
Arguments of the functions to compose can be the same symbol, they are not "scrambled":
 
[[File:Fōrmulæ - Function composition 04.png]]
 
[[File:Fōrmulæ - Function composition 05.png]]
 
Because a function in Fōrmulæ is just a lambda expression, a lambda expression can be directly provided.
 
[[File:Fōrmulæ - Function composition 06.png]]
 
[[File:Fōrmulæ - Function composition 03.png]]
 
[[File:Fōrmulæ - Function composition 07.png]]
 
[[File:Fōrmulæ - Function composition 05.png]]
 
Since the composition function returns a lambda expression, it is not required to be applied:
 
[[File:Fōrmulæ - Function composition 08.png]]
 
[[File:Fōrmulæ - Function composition 09.png]]
 
[[File:Fōrmulæ - Function composition 10.png]]
 
[[File:Fōrmulæ - Function composition 11.png]]
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap">Composition := function(f, g)
return x -> f(g(x));
end;
Line 501 ⟶ 1,467:
h := Composition(x -> x+1, x -> x*x);
h(5);
# 26</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">// Go doesn't have generics, but sometimes a type definition helps
// readability and maintainability. This example is written to
// the following function type, which uses float64.
Line 514 ⟶ 1,480:
return f(g(x))
}
}</langsyntaxhighlight>
Example use:
<langsyntaxhighlight lang="go">package main
 
import "math"
Line 532 ⟶ 1,498:
sin_asin := compose(math.Sin, math.Asin)
fmt.Println(sin_asin(.5))
}</langsyntaxhighlight>
{{out}}
Output:
<pre>
0.5
Line 539 ⟶ 1,505:
 
=={{header|Groovy}}==
Solution:
<lang groovy>def compose = { f, g -> { x -> f(g(x)) } }</lang>
 
Test program:
<langsyntaxhighlight lang="groovy">deffinal sqtimes2 = { it * it2 }
deffinal plus1 = { it + 1 }
def minus1 = { it - 1 }
 
deffinal plus1sqdplus1_then_times2 = compose(sq,times2 << plus1)
final times2_then_plus1 = times2 >> plus1
def sqminus1 = compose(minus1,sq)
def identity = compose(plus1,minus1)
def plus1sqdminus1 = compose(minus1,compose(sq,plus1))
def identity2 = compose(Math.&sin,Math.&asin)
 
assert plus1_then_times2(3) == 8
println "(x+1)**2 = (0+1)**2 = " + plus1sqd(0)
assert times2_then_plus1(3) == 7</syntaxhighlight>
println "x**2-1 = 20**2-1 = " + sqminus1(20)
println "(x+1)-1 = (12+1)-1 = " + identity(12)
println "(x+1)**2-1 = (3+1)**2-1 = " + plus1sqdminus1(3)
println "sin(asin(x)) = sin(asin(1)) = " + identity2(1)</lang>
 
Output:
<pre>(x+1)**2 = (0+1)**2 = 1
x**2-1 = 20**2-1 = 399
(x+1)-1 = (12+1)-1 = 12
(x+1)**2-1 = (3+1)**2-1 = 15
sin(asin(x)) = sin(asin(1)) = 1.0</pre>
 
=={{header|Haskell}}==
This is already defined as the '''.''' (dot) operator in Haskell.:
 
<lang haskell>compose f g x = f (g x)</lang>
<syntaxhighlight lang="haskell">Prelude> let sin_asin = sin . asin
Prelude> sin_asin 0.5
0.49999999999999994</syntaxhighlight>
 
Ways to use directly:
<syntaxhighlight lang="haskell">(sin . asin) 0.5</syntaxhighlight>
<syntaxhighlight lang="haskell">sin . asin $ 0.5</syntaxhighlight>
 
 
Implementing compose function from scratch:
<syntaxhighlight lang="haskell">compose f g x = f (g x)</syntaxhighlight>
Example use:
<langsyntaxhighlight lang="haskell">Prelude> let compose f g x = f (g x)
Prelude> let sin_asin = compose sin asin
Prelude> sin_asin 0.5
0.5</langsyntaxhighlight>
 
 
Right to left composition of a list of functions could be defined as ''flip (foldr id)'':
 
<syntaxhighlight lang="haskell">composeList :: [a -> a] -> a -> a
composeList = flip (foldr id)
 
main :: IO ()
main = print $ composeList [(/ 2), succ, sqrt] 5</syntaxhighlight>
{{Out}}
<pre>1.618033988749895</pre>
 
=={{header|Hy}}==
<syntaxhighlight lang="clojure">(defn compose [f g]
(fn [x]
(f (g x))))</syntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
Line 584 ⟶ 1,560:
 
The solution below can be adapted to work in Icon by reverting to the old syntax for invoking co-expressions.
<langsyntaxhighlight Iconlang="icon"> x @ f # use this syntax in Icon instead of the Unicon f(x) to call co-expressions
every push(fL := [],!rfL) # use this instead of reverse(fL) as the Icon reverse applies only to strings</langsyntaxhighlight>
See [[Icon%2BUnicon/Intro#Minor_Differences|Icon and Unicon Introduction:Minor Differences]] for more information
 
<langsyntaxhighlight Uniconlang="unicon">procedure main(arglist)
h := compose(sqrt,abs)
k := compose(integer,"sqrt",ord)
Line 618 ⟶ 1,594:
return (@cf, cf) # 'prime' the co-expr before returning it
 
end</langsyntaxhighlight>
 
{{out}}
Sample Output:
<pre>-2 h=(sqrt,abs)-> 1.414213562373095
-1 h=(sqrt,abs)-> 1.0
Line 635 ⟶ 1,611:
 
'''Solution''':
<langsyntaxhighlight lang="j">compose =: @</langsyntaxhighlight>
 
'''Example''':
<syntaxhighlight lang ="j">f compose g</langsyntaxhighlight>
 
Of course, given that <ttcode>@</ttcode> is only one character long and is a built-in primitive, there is no need for the cover function <ttcode>compose</ttcode>. And <ttcode>@</ttcode> is not the only composition primitive; composition is a very important concept in J. For more details, see the [[Talk:Functional Composition#J|talk page]].
 
Tentative new example:
 
<syntaxhighlight lang="j">f=: >.@(1&o.)@%:
g=: 1&+@|@(2&o.)
h=: f@g</syntaxhighlight>
 
Example use:
<syntaxhighlight lang="j"> (f, g, h) 1p1
1 2 1</syntaxhighlight>
 
Note: <code>1&o.</code> is sine (mnemonic: sine is an odd circular function), <code>2&o.</code> is cosine (cosine is an even circular function), <code>%:</code> is square root, <code>>.</code> is ceiling, <code>|</code> is absolute value and <code>1&+</code> adds 1.
 
=={{header|Janet}}==
 
Janet supports function composition with the [https://janet-lang.org/api/misc.html#comp <code>comp</code>] function.
 
<syntaxhighlight lang="janet">(defn fahrenheit->celsius [deg-f]
(/ (* (- deg-f 32) 5) 9))
 
(defn celsius->kelvin [deg-c]
(+ deg-c 273.15))
 
(def fahrenheit->kelvin (comp celsius->kelvin fahrenheit->celsius))
 
(fahrenheit->kelvin 72) // 295.372
</syntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">public class Compose {
 
// Java doesn't have function type so we define an interface
Line 675 ⟶ 1,678:
System.out.println(sin_asin.call(0.5)); // prints "0.5"
}
}</langsyntaxhighlight>
 
===Java 8===
 
Java 8's <code>Function</code> interface already has a <code>.compose()</code> default method:
{{works with|Java|8+}}
<syntaxhighlight lang="java">import java.util.function.Function;
 
public class Compose {
public static void main(String[] args) {
Function<Double,Double> sin_asin = ((Function<Double,Double>)Math::sin).compose(Math::asin);
 
System.out.println(sin_asin.apply(0.5)); // prints "0.5"
}
}</syntaxhighlight>
 
Implementing it yourself as a static method:
{{works with|Java|8+}}
<syntaxhighlight lang="java">import java.util.function.Function;
 
public class Compose {
public static <A,B,C> Function<A,C> compose(Function<B,C> f, Function<A,B> g) {
return x -> f.apply(g.apply(x));
}
 
public static void main(String[] args) {
Function<Double,Double> sin_asin = compose(Math::sin, Math::asin);
 
System.out.println(sin_asin.apply(0.5)); // prints "0.5"
}
}</syntaxhighlight>
 
=={{header|JavaScript}}==
===ES5===
<lang javascript>function compose(f, g) {
====Simple composition of two functions====
return function(x) { return f(g(x)) }
<syntaxhighlight lang="javascript">function compose(f, g) {
}
return function(x) {
return f(g(x));
};
}</syntaxhighlight>
Example:
<syntaxhighlight lang="javascript">var id = compose(Math.sin, Math.asin);
console.log(id(0.5)); // 0.5</syntaxhighlight>
 
 
var id = compose(Math.sin, Math.asin)
====Multiple composition====
print id(0.5) // 0.5</lang>
 
Recursion apart, multiple composition can be written in at least two general ways in JS:
 
# Iteratively (faster to run, perhaps more fiddly to write)
# With a fold / reduction (see http://rosettacode.org/wiki/Catamorphism). The fold is arguably simpler to write and reason about, though not quite as fast to execute.
 
<syntaxhighlight lang="javascript">(function () {
'use strict';
 
 
// iterativeComposed :: [f] -> f
function iterativeComposed(fs) {
 
return function (x) {
var i = fs.length,
e = x;
 
while (i--) e = fs[i](e);
return e;
}
}
 
// foldComposed :: [f] -> f
function foldComposed(fs) {
 
return function (x) {
return fs
.reduceRight(function (a, f) {
return f(a);
}, x);
};
}
 
 
var sqrt = Math.sqrt,
 
succ = function (x) {
return x + 1;
},
 
half = function (x) {
return x / 2;
};
 
 
// Testing two different multiple composition ([f] -> f) functions
 
return [iterativeComposed, foldComposed]
.map(function (compose) {
 
// both functions compose from right to left
return compose([half, succ, sqrt])(5);
 
});
})();
</syntaxhighlight>
 
{{Out}}
<pre>[1.618033988749895, 1.618033988749895]</pre>
 
 
===ES6===
 
 
====Simple composition of two functions====
<syntaxhighlight lang="javascript">function compose(f, g) {
return x => f(g(x));
}</syntaxhighlight>
or
<syntaxhighlight lang="javascript">var compose = (f, g) => x => f(g(x));</syntaxhighlight>
Example:
<syntaxhighlight lang="javascript">var id = compose(Math.sin, Math.asin);
console.log(id(0.5)); // 0.5</syntaxhighlight>
 
 
====Multiple composition====
<syntaxhighlight lang="javascript">(() => {
"use strict";
 
// -------------- MULTIPLE COMPOSITION ---------------
 
// compose (<<<) :: (b -> c) -> (a -> b) -> a -> c
const compose = (...fs) =>
// A function defined by the right-to-left
// composition of all the functions in fs.
fs.reduce(
(f, g) => x => f(g(x)),
x => x
);
 
// ---------------------- TEST -----------------------
const
sqrt = Math.sqrt,
succ = x => x + 1,
half = x => x / 2;
 
return compose(half, succ, sqrt)(5);
 
// --> 1.618033988749895
})();</syntaxhighlight>
{{Out}}
<pre>1.618033988749895</pre>
 
=={{header|Joy}}==
Composition is the default operation in Joy. The composition of two functions is the concatenation of those functions, in the order in which they are to be applied.
<syntaxhighlight lang ="joy">g f</langsyntaxhighlight>
And yes, there should be a space between the two names.
 
=={{header|jq}}==
The equivalent in jq of a function with one argument is a 0-arity filter. For example, in jq, exp is the exponential function and can be evaluated like so: <tt>0.5 | exp</tt>.
 
We therefore illustrate here how a function that composes two 0-arity filters can be written:
<syntaxhighlight lang="jq">
# apply g first and then f
def compose(f; g): g | f;
</syntaxhighlight>
Example: 0.5 | compose(asin; sin)
 
In practice, "compose" is rarely used since, given two 0-arity filters, f and g, the expression "g|f" can be passed as an argument to other functions.
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
'''Built-in''':
<syntaxhighlight lang="julia">@show (asin ∘ sin)(0.5)</syntaxhighlight>
 
'''Alternative''':
<syntaxhighlight lang="julia">compose(f::Function, g::Function) = (x) -> g(f(x))
@show compose(sin, asin)(0.5)</syntaxhighlight>
 
=={{header|K}}==
The K syntax for APL tacit (point free) function composition is the dyadic form of apostrophe ('), here is a cover function
Functions are automatically curried in K if called with missing arguments.
<syntaxhighlight lang ="k">compose: {'[x@;y@z]}</langsyntaxhighlight>
 
An equivalent explicit definition would be
<syntaxhighlight lang="k">compose:{x[y[z]]}</syntaxhighlight>
 
'''Example:'''
<langsyntaxhighlight lang="k"> sin_asin: compose[_sinsin;_asinasin] // or compose . (sin;asin)
sin_asin 0.5
0.5</langsyntaxhighlight>
 
=={{header|Klingphix}}==
<syntaxhighlight lang="klingphix">include ..\Utilitys.tlhy
 
:*2 2 * ;
:++ 1 + ;
:composite swap exec swap exec ;
@++ @*2 3 composite ? { result: 7 }
 
"End " input</syntaxhighlight>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="kotlin">
fun f(x: Int): Int = x * x
 
fun g(x: Int): Int = x + 2
 
fun <T, V, R> compose(f: (V) -> R, g: (T) -> V): (T) -> R = { f(g(it) }
 
fun main() {
val x = 10
println(compose(::f, ::g)(x))
}</syntaxhighlight>
 
{{out}}
<pre>
144
</pre>
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
{def compose
{lambda {:f :g :x}
{:f {:g :x}}}}
-> compose
 
{def funcA {lambda {:x} {* :x 10}}}
-> funcA
 
{def funcB {lambda {:x} {+ :x 5}}}
-> funcB
 
{def f {compose funcA funcB}}
-> f
 
{{f} 3}
-> 80
</syntaxhighlight>
 
=={{header|Lang}}==
<syntaxhighlight lang="lang">
fp.f = ($x) -> return parser.op($x * 3)
fp.g = ($x) -> return parser.op($x + 2)
 
$x = 5
 
# In Lang this task can be achieved with the concat operator
fn.println(parser.op((fp.g ||| fp.f)($x))) # Prints 21 [Internal execution: fp.f(fp.g($x))]
 
# Creating a user-defined function doing the same thing is a bit more difficult
fp.compose = (fp.f, fp.g) -> {
fp.innerFunc = (fp.f, fp.g, $x) -> return fp.f(fp.g($x))
return fn.argCnt1(fn.combA3(fp.innerFunc, fp.f, fp.g)) # fn.combA3 must be used, because Lang does not support closures
}
 
fn.println(fp.compose(fp.f, fp.g)($x)) # Prints also 21
</syntaxhighlight>
 
=={{header|LFE}}==
<syntaxhighlight lang="lisp">
(defun compose (f g)
(lambda (x)
(funcall f
(funcall g x))))
 
(defun compose (funcs)
(lists:foldl #'compose/2
(lambda (x) x)
funcs))
 
(defun check ()
(let* ((sin-asin (compose #'math:sin/1 #'math:asin/1))
(expected (math:sin (math:asin 0.5)))
(compose-result (funcall sin-asin 0.5)))
(io:format '"Expected answer: ~p~n" (list expected))
(io:format '"Answer with compose: ~p~n" (list compose-result))))
</syntaxhighlight>
 
If you pasted those into the LFE REPL, you can do the following:
<syntaxhighlight lang="lisp">
> (funcall (compose #'math:sin/1 #'math:asin/1)
0.5)
0.49999999999999994
> (funcall (compose `(,#'math:sin/1
,#'math:asin/1
,(lambda (x) (+ x 1))))
0.5)
1.5
> (check)
Expected answer: 0.49999999999999994
Answer with compose: 0.49999999999999994
ok
>
</syntaxhighlight>
 
=={{header|Lingo}}==
Lingo does not support functions as first-class objects. However, there is a way to achieve something similar:
 
In Lingo global functions (i.e. either built-in functions or custom functions defined in movie scripts) are methods of the _movie object. There are 2 ways to call such functions:
 
*a) foo (1,2,3)
*b) call (#foo, _movie, 1, 2, 3)
<br />
If we ignore the standard way a) and only concentrate on b), we can define a "call-function" (arbitrary word coining) as:
 
: ''"Anything that supports the syntax 'call(<func>, _movie [, comma-separated arg list])' and might return a value."''
 
As described above, this "call-function" definition includes all built-in and global user-defined functions.
 
For such "call-functions", function composition can be implemented using the following global (i.e. movie script) function compose() and the following parent script "Composer":
 
<syntaxhighlight lang="lingo">-- in some movie script
----------------------------------------
-- Composes 2 call-functions, returns a new call-function
-- @param {symbol|instance} f
-- @param {symbol|instance} g
-- @return {instance}
----------------------------------------
on compose (f, g)
return script("Composer").new(f, g)
end</syntaxhighlight>
 
<syntaxhighlight lang="lingo">-- parent script "Composer"
 
property _f
property _g
 
----------------------------------------
-- @constructor
-- @param {symbol|instance} f
-- @param {symbol|instance} g
----------------------------------------
on new (me, f, g)
me._f = f
me._g = g
return me
end
 
on call (me)
if ilk(me._g)=#instance then
cmd = "_movie.call(#call,me._g,VOID"
else
cmd = "_movie.call(me._g,_movie"
end if
a = [] -- local args list
repeat with i = 1 to the paramCount-2
a[i] = param(i+2)
put ",a["&i&"]" after cmd
end repeat
put ")" after cmd
if ilk(me._f)=#instance then
return _movie.call(#call, me._f, VOID, value(cmd))
else
return _movie.call(me._f, _movie, value(cmd))
end if
end</syntaxhighlight>
 
Usage:
<syntaxhighlight lang="lingo">-- compose new function based on built-in function 'sin' and user-defined function 'asin'
f1 = compose(#asin, #sin)
put call(f1, _movie, 0.5)
-- 0.5000
 
-- compose new function based on previously composed function 'f1' and user-defined function 'double'
f2 = compose(#double, f1)
put call(f2, _movie, 0.5)
-- 1.0000
 
-- compose new function based on 2 composed functions
f1 = compose(#asin, #sin)
f2 = compose(#double, #triple)
f3 = compose(f2, f1)
put call(f3, _movie, 0.5)
-- 3.0000</syntaxhighlight>
 
User-defined custom functions used in demo code above:
<syntaxhighlight lang="lingo">-- in some movie script
on asin (x)
res = atan(sqrt(x*x/(1-x*x)))
if x<0 then res = -res
return res
end
 
on double (x)
return x*2
end
 
on triple (x)
return x*3
end</syntaxhighlight>
 
=={{header|LOLCODE}}==
LOLCODE supports first-class functions only insofar as they may be stored in variables and returned from other functions. Alas, given the current lack of support for either lambdas or closures, function composition can only be reasonably simulated with the help of a few global variables.
<syntaxhighlight lang="lolcode">HAI 1.3
 
I HAS A fx, I HAS A gx
 
HOW IZ I composin YR f AN YR g
fx R f, gx R g
HOW IZ I composed YR x
FOUND YR I IZ fx YR I IZ gx YR x MKAY MKAY
IF U SAY SO
FOUND YR composed
IF U SAY SO
 
HOW IZ I incin YR num
FOUND YR SUM OF num AN 1
IF U SAY SO
 
HOW IZ I sqrin YR num
FOUND YR PRODUKT OF num AN num
IF U SAY SO
 
I HAS A incsqrin ITZ I IZ composin YR incin AN YR sqrin MKAY
VISIBLE I IZ incsqrin YR 10 MKAY BTW, prints 101
 
I HAS A sqrincin ITZ I IZ composin YR sqrin AN YR incin MKAY
VISIBLE I IZ sqrincin YR 10 MKAY BTW, prints 121
 
KTHXBYE</syntaxhighlight>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function compose(f, g) return function(...) return f(g(...)) end end</langsyntaxhighlight>
 
=={{header|MathematicaM2000 Interpreter}}==
===Using Lambda functions===
<syntaxhighlight lang="m2000 interpreter">
Module CheckIt {
Compose = lambda (f, g)->{
=lambda f, g (x)->f(g(x))
}
Add5=lambda (x)->x+5
Division2=lambda (x)->x/2
Add5Div2=compose(Division2, Add5)
Print Add5Div2(15)=10 ' True
}
CheckIt
</syntaxhighlight>
===Using EVAL and EVAL$===
<syntaxhighlight lang="m2000 interpreter">
class Compose {
private:
composition$
public:
function formula$ {
=.composition$
}
value (x){
=Eval(.composition$)
}
Class:
module compose(a$, b$) {
.composition$<=a$+"("+b$+"(x))"
}
}
function Global Exp(x) {
=round(2.7182818284590452**x)
}
class ComposeStr$ {
private:
composition$
public:
function formula$ {
=.composition$
}
value (x$){
=Eval$(.composition$.) // NEED A DOT AFTER STRING VARIABLE
}
Class:
module composeStr(a$, b$) {
.composition$<=a$+"("+b$+"(x$))"
}
}
ExpLog=Compose("Exp", "Ln")
Print ExpLog(3)
UcaseLcase$=ComposeStr$("Ucase$", "Lcase$")
Print UcaseLcase$("GOOD")
</syntaxhighlight>
 
=={{header|Mathcad}}==
Mathcad is a non-text-based programming environment. The expressions below are an approximations of the way that they are entered (and) displayed on a Mathcad worksheet. The worksheet is available at xxx_tbd_xxx
 
This particular version of Function Composition was created in Mathcad Prime Express 7.0, a free version of Mathcad Prime 7.0 with restrictions (such as no programming or symbolics). All Prime Express numbers are complex. There is a recursion depth limit of about 4,500.
 
compose(f,g,x):=f(g(x))
 
cube(x):=x<sup>3</sup> cuberoot(x):=x<sup>1/3</sup>
 
funlist:=[sin cos cube]<sup>T</sup> invlist:=[asin acos cuberoot]<sup>T</sup>
 
invfunlist(x):= {vectorize}compose(invlist,funlist,x){/vectorize}
 
x:= 0.5
 
invfunlist(x)= {results of evaluation appears here) invfunlist([x √2 3]<sup>T</sup>)= {results)
 
apply(f,x):=f(x) apply(f,x):={vectorize}apply(f,x){/vectorize}
 
apply(funlist,x)= {results} + ... several more examples
 
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
Built-in function that takes any amount of function-arguments:
<langsyntaxhighlight Mathematicalang="mathematica">Composition[f, g][x]
Composition[f, g, h, i][x]</langsyntaxhighlight>
gives back:
<langsyntaxhighlight Mathematicalang="mathematica">f[g[x]]
f[g[h[i[x]]]]</langsyntaxhighlight>
Custom function:
<langsyntaxhighlight Mathematicalang="mathematica">compose[f_, g_][x_] := f[g[x]]
compose[Sin, Cos][r]</langsyntaxhighlight>
gives back:
<syntaxhighlight lang Mathematica="mathematica">Sin[Cos[r]]</langsyntaxhighlight>
Composition can be done in more than 1 way:
<langsyntaxhighlight Mathematicalang="mathematica">Composition[f,g,h][x]
f@g@h@x
x//h//g//f</langsyntaxhighlight>
all give back:
<syntaxhighlight lang Mathematica="mathematica">f[g[h[x]]]</langsyntaxhighlight>
The built-in function has a couple of automatic simplifications:
<langsyntaxhighlight Mathematicalang="mathematica">Composition[f, Identity, g]
Composition[f, InverseFunction[f], h][x]</langsyntaxhighlight>
becomes:
<langsyntaxhighlight Mathematicalang="mathematica">f[g[x]]
h[x]</langsyntaxhighlight>
 
=={{header|Maxima}}==
<syntaxhighlight lang="maxima">/* built-in */
load(to_poly_solver);
 
compose_functions([sin, cos]);
/* lambda([%g0],sin(cos(%g0)))*/
 
/* An implementation, to show a use of buildq */
compose(f, g) := buildq([f, g], lambda([x], f(g(x))));</syntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.3}}
Since min is both [http://concatenative.org/wiki/view/Concatenative%20language concatenative] and homoiconic, function composition is equivalent to list concatenation. Example:
<syntaxhighlight lang="min">(1 +) (2 *) concat print</syntaxhighlight>
{{out}}
<pre>
(1 + 2 *)
</pre>
 
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">funcA = function(x)
return x * 10
end function
 
funcB = function(x)
return x + 5
end function
 
compose = function(f, g)
return function(x)
return f(g(x))
end function
end function
 
f = compose(@funcA, @funcB)
print f(3) // should be equal to (3+5)*10</syntaxhighlight>
{{out}}
<pre>80</pre>
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">using System;
using System.Console;
using System.Math;
Line 742 ⟶ 2,257:
WriteLine(SinAsin(0.5));
}
}</langsyntaxhighlight>
 
=={{header|Never}}==
<syntaxhighlight lang="never">
func compose(f(i : int) -> int, g(i : int) -> int) -> (int) -> int
{
let func (i : int) -> int { f(g(i)) }
}
 
func dec(i : int) -> int { 10 * i }
 
func succ(i : int) -> int { i + 1 }
 
func main() -> int
{
let h = compose(dec, succ);
 
print(h(1));
 
0
}
</syntaxhighlight>
 
=={{header|NewLISP}}==
 
<langsyntaxhighlight NewLISPlang="newlisp">> (define (compose f g) (expand (lambda (x) (f (g x))) 'f 'g))
(lambda (f g) (expand (lambda (x) (f (g x))) 'f 'g))
> ((compose sin asin) 0.5)
0.5
</syntaxhighlight>
</lang>
 
=={{header|Objective-CNim}}==
<syntaxhighlight lang="nim">import sugar
 
proc compose[A,B,C](f: B -> C, g: A -> B): A -> C = (x: A) => f(g(x))
The <tt>FunctionComposer</tt> is able to ''compose'' any object that conforms to the protocol <tt>FunctionCapsule</tt> (a selector/method accepting any object as argument and returning another object, i.e. ''computing'' a "function" of an object). A <tt>FunctionCaps</tt> class thought to ''encapsulate'' a function returning a double and with a double as argument is shown; anyway, as said, any object conforming to FunctionCapsule protocol can be composed with another object conforming to the same protocol. Argument passed and returned can be of any object type.
 
proc plustwo(x: int): int = x + 2
<lang objc>#include <Foundation/Foundation.h>
proc minustwo(x: int): int = x - 2
 
var plusminustwo = compose(plustwo, minustwo)
// the protocol of objects that can behave "like function"
echo plusminustwo(10)</syntaxhighlight>
@protocol FunctionCapsule <NSObject>
-(id)computeWith: (id)x;
@end
 
=={{header|Objeck}}==
<syntaxhighlight lang="objeck">
bundle Default {
class Test {
@f : static : (Int) ~ Int;
@g : static : (Int) ~ Int;
function : Main(args : String[]) ~ Nil {
compose := Composer(F(Int) ~ Int, G(Int) ~ Int);
compose(13)->PrintLine();
}
function : F(a : Int) ~ Int {
return a + 14;
}
 
function : G(a : Int) ~ Int {
// a commodity for "encapsulating" double f(double)
return a + 15;
typedef double (*func_t)(double);
}
@interface FunctionCaps : NSObject <FunctionCapsule>
{
func_t function; : Compose(x : Int) ~ Int {
return @f(@g(x));
}
}
+(id)capsuleFor: (func_t)f;
-(id)initWithFunc: (func_t)f;
function : Composer(f : (Int) ~ Int, g : (Int) ~ Int) ~ (Int) ~ Int {
@end
@f := f;
 
@g := g;
@implementation FunctionCaps
return Compose(Int) ~ Int;
-(id)initWithFunc: (func_t)f
}
{
if ((self = [self init])) {
function = f;
}
return self;
}
</syntaxhighlight>
+(id)capsuleFor: (func_t)f
prints: 42
{
return [[[self alloc] initWithFunc: f] autorelease];
}
-(id)computeWith: (id)x
{
return [NSNumber numberWithDouble: function([x doubleValue])];
}
@end
 
=={{header|ObjectIcon}}==
{{trans|Icon and Unicon}}
 
// the "functions" composer
@interface FunctionComposer : NSObject <FunctionCapsule>
{
id<FunctionCapsule> funcA;
id<FunctionCapsule> funcB;
}
+(id) createCompositeFunctionWith: (id<FunctionCapsule>)A and: (id<FunctionCapsule>)B;
-(id) initComposing: (id<FunctionCapsule>)A with: (id<FunctionCapsule>)B;
@end
 
<syntaxhighlight lang="objecticon"># -*- ObjectIcon -*-
@implementation FunctionComposer
#
+(id) createCompositeFunctionWith: (id<FunctionCapsule>)A and: (id<FunctionCapsule>)B
# The Rosetta Code function composition task, in Object Icon.
{
# Composition will result in a co-expression.
return [[[self alloc] initComposing: A with: B] autorelease];
#
}
# Object Icon co-expressions are closures: they share the local
# variables of the context in which they are created. In Arizona Icon,
# co-expressions obtain only the *values* of those variables. However,
# this difference, despite its significance, is not really important
# to the notion of composition.
#
# This example is adapted from the Unicon implementation of the
# task. To simplify the example, I have removed support for string
# invocations.
#
 
import io
-(id) init
{
[self release];
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:@"FunctionComposer: init with initComposing!"
userInfo:nil];
return nil;
}
 
procedure main (arglist)
-(id) initComposing: (id<FunctionCapsule>)A with: (id<FunctionCapsule>)B
local f, g
{
if ((self = [super init])) {
if ( [A respondsToSelector: @selector(computeWith:)] &&
[B respondsToSelector: @selector(computeWith:)] ) {
funcA = [A retain]; funcB = [B retain];
return self;
}
NSLog(@"FunctionComposer: cannot compose functions not responding to protocol FunctionCapsule!");
[self release];
}
return nil;
}
 
# f gets a co-expression that is a composition of three procedures.
-(id)computeWith: (id)x
f := compose(append_exclamation, string_repeat, double_it)
{
write(123@f)
return [funcA computeWith: [funcB computeWith: x]];
}
 
# g gets a co-expression that is a composition of a procedure and f.
-(void) dealloc
g := compose(string_repeat, f)
{
write(123@g)
[funcA release];
end
[funcB release];
[super dealloc];
}
@end
 
procedure double_it (n)
return n + n
end
 
procedure string_repeat (x)
// functions outside...
return string(x) || string(x)
double my_f(double x)
end
{
return x+1.0;
}
 
procedure append_exclamation (s)
double my_g(double x)
return s || "!"
{
end
return x*x;
}
 
procedure compose (rfL[])
local x, f, saveSource, fL, cf
every push(fL := [], !rfL)
cf := create {
saveSource := &source
repeat {
x := x@saveSource
saveSource := &source
every f := !fL do {
case type(f) of {
"co-expression": x := x@f
default: x := f(x)
}
}
}
}
 
# Co-expressions often need to be "primed" before they can be
int main()
# used.
{
@cf
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
return cf
id<FunctionCapsule> funcf = [FunctionCaps capsuleFor: my_f];
end</syntaxhighlight>
id<FunctionCapsule> funcg = [FunctionCaps capsuleFor: my_g];
 
{{out}}
id<FunctionCapsule> composed = [FunctionComposer
<pre>$ oit -s function_composition-OI.icn && ./function_composition-OI
createCompositeFunctionWith: funcf and: funcg];
246246!
246246!246246!</pre>
 
printf("g(2.0) = %lf\n", [[funcg computeWith: [NSNumber numberWithDouble: 2.0]] doubleValue]);
printf("f(2.0) = %lf\n", [[funcf computeWith: [NSNumber numberWithDouble: 2.0]] doubleValue]);
printf("f(g(2.0)) = %lf\n", [[composed computeWith: [NSNumber numberWithDouble: 2.0]] doubleValue]);
 
=={{header|Objective-C}}==
[pool release];
return 0;
}</lang>
 
===Blocks===
{{works with|Mac OS X|10.6+}}
As above, weWe restrict ourselves to functions that take and return one object.
 
<langsyntaxhighlight lang="objc">#include <Foundation/Foundation.h>
 
typedef id (^Function)(id);
Line 887 ⟶ 2,421:
typedef double (*func_t)(double);
Function encapsulate(func_t f) {
return [[^(id x) { return [NSNumber numberWithDouble: @(f([x doubleValue])]); } copy] autorelease];
}
 
Function compose(Function a, Function b) {
return [[^(id x) { return a(b(x)); } copy] autorelease];
}
 
Line 908 ⟶ 2,442:
int main()
{
@autoreleasepool {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
Function f = encapsulate(my_f);
Function g = encapsulate(my_g);
Function composed = compose(f, g);
printf("g(2.0) = %lf\n", [g([NSNumber numberWithDouble: @2.0]) doubleValue]);
printf("f(2.0) = %lf\n", [f([NSNumber numberWithDouble: @2.0]) doubleValue]);
printf("f(g(2.0)) = %lf\n", [composed([NSNumber numberWithDouble: @2.0]) doubleValue]);
 
}
[pool release];
return 0;
}</langsyntaxhighlight>
 
=={{header|Objeck}}==
<lang objeck>
bundle Default {
class Test {
@f : static : (Int) ~ Int;
@g : static : (Int) ~ Int;
function : Main(args : String[]) ~ Nil {
compose := Composer(F(Int) ~ Int, G(Int) ~ Int);
compose(13)->PrintLine();
}
function : F(a : Int) ~ Int {
return a + 14;
}
 
function : G(a : Int) ~ Int {
return a + 15;
}
function : Compose(x : Int) ~ Int {
return @f(@g(x));
}
function : Composer(f : (Int) ~ Int, g : (Int) ~ Int) ~ (Int) ~ Int {
@f := f;
@g := g;
return Compose(Int) ~ Int;
}
}
}
</lang>
prints: 42
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let compose f g x = f (g x)</langsyntaxhighlight>
Example use:
<langsyntaxhighlight lang="ocaml"># let compose f g x = f (g x);;
val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
# let sin_asin = compose sin asin;;
val sin_asin : float -> float = <fun>
# sin_asin 0.5;;
- : float = 0.5</langsyntaxhighlight>
 
=={{header|Octave}}==
 
<langsyntaxhighlight lang="octave">function r = compose(f, g)
r = @(x) f(g(x));
endfunction
 
r = compose(@exp, @sin);
r(pi/3)</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
Oforth uses RPN notation. Function composition of f and g is just calling :
<syntaxhighlight lang="oforth">g f</syntaxhighlight>
If a block is needed, a compose function can be implemented :
<syntaxhighlight lang="oforth">: compose(f, g) #[ g perform f perform ] ;</syntaxhighlight>
Usage :
<syntaxhighlight lang="oforth">1.2 compose(#asin, #sin) perform
[ 1, 2, 3, 4, 5 ] compose(#[ map(#sqrt) ], #[ filter(#isEven) ]) perform</syntaxhighlight>
The last line returns : [1.4142135623731, 2]
 
=={{header|Ol}}==
<syntaxhighlight lang="scheme">
(define (compose f g)
(lambda (x) (f (g x))))
 
;; or:
 
(define ((compose f g) x) (f (g x)))
</syntaxhighlight>
 
=={{header|Order}}==
Order supplies the built-in function <code>8compose</code> for this purpose. However, a manual implementation might be:
<syntaxhighlight lang="c">#include <order/interpreter.h>
 
#define ORDER_PP_DEF_8comp ORDER_PP_FN( \
8fn(8F, 8G, 8fn(8X, 8ap(8F, 8ap(8G, 8X)))) )</syntaxhighlight>
Interpreter limitations mean that local variables containing functions must be called with the <code>8ap</code> operator, but the functions themselves are still first-class values.
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
fun {Compose F G}
fun {$ X}
Line 986 ⟶ 2,515:
SinAsin = {Compose Float.sin Float.asin}
in
{Show {SinAsin 0.5}}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
{{works with|PARI/GP|2.4.2 and above}}
<langsyntaxhighlight lang="parigp">compose(f, g)={
x -> f(g(x))
};
 
compose(x->sin(x),x->cos(x)(1)</langsyntaxhighlight>
 
Usage note: In Pari/GP 2.4.3, this can be expressed more succinctly:
<syntaxhighlight lang ="parigp">compose(sin,cos)(1)</langsyntaxhighlight>
 
=={{header|Pascal}}==
See [[Function_composition#Delphi | Delphi]]
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">sub compose {
my ($f, $g) = @_;
 
Line 1,009 ⟶ 2,541:
 
use Math::Trig;
print compose(sub {sin $_[0]}, \&asin)->(0.5), "\n";</langsyntaxhighlight>
 
=={{header|Perl 6Phix}}==
There is not really any direct support for this sort of thing in Phix, but it is all pretty trivial to manage explicitly.<br>
{{works with|rakudo}}
In the following, as it stands, you cannot use constant m in the same way as a routine_id, or pass a standard routine_id to call_composite(), but tagging the ctable entries so that you know precisely what to do with each entry does not sound the least bit difficult to me.
We'll define an infix compose operator from <tt>∘</tt>, U+2218 RING OPERATOR.
<!--<syntaxhighlight lang="phix">-->
<lang perl6>sub infix:<∘> (&f, &g --> Block) {
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ctable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{<span style="color: #0000FF;">}</span>
-> \$args { f g |$args }
}</lang>
<span style="color: #008080;">function</span> <span style="color: #000000;">compose<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">f<span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">g<span style="color: #0000FF;">)</span>
<span style="color: #000000;">ctable</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append<span style="color: #0000FF;">(<span style="color: #000000;">ctable<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #000000;">f<span style="color: #0000FF;">,<span style="color: #000000;">g<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">length<span style="color: #0000FF;">(<span style="color: #000000;">ctable<span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">call_composite<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">f<span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">x<span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">g</span>
<span style="color: #0000FF;">{<span style="color: #000000;">f<span style="color: #0000FF;">,<span style="color: #000000;">g<span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ctable<span style="color: #0000FF;">[<span style="color: #000000;">f<span style="color: #0000FF;">]</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">call_func<span style="color: #0000FF;">(<span style="color: #000000;">f<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #7060A8;">call_func<span style="color: #0000FF;">(<span style="color: #000000;">g<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #000000;">x<span style="color: #0000FF;">}<span style="color: #0000FF;">)<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">plus1<span style="color: #0000FF;">(<span style="color: #004080;">atom</span> <span style="color: #000000;">x<span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">x<span style="color: #0000FF;">+<span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">halve<span style="color: #0000FF;">(<span style="color: #004080;">atom</span> <span style="color: #000000;">x<span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">x<span style="color: #0000FF;">/<span style="color: #000000;">2</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">compose<span style="color: #0000FF;">(<span style="color: #7060A8;">routine_id<span style="color: #0000FF;">(<span style="color: #008000;">"halve"<span style="color: #0000FF;">)<span style="color: #0000FF;">,<span style="color: #7060A8;">routine_id<span style="color: #0000FF;">(<span style="color: #008000;">"plus1"<span style="color: #0000FF;">)<span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?<span style="color: #000000;">call_composite<span style="color: #0000FF;">(<span style="color: #000000;">m<span style="color: #0000FF;">,<span style="color: #000000;">1<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 1</span>
<span style="color: #0000FF;">?<span style="color: #000000;">call_composite<span style="color: #0000FF;">(<span style="color: #000000;">m<span style="color: #0000FF;">,<span style="color: #000000;">4<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 2.5
<!--</syntaxhighlight>-->
 
=={{header|Phixmonti}}==
Example of composing a routine, an operator, and a lambda:
<syntaxhighlight lang="phixmonti">def *2 2 * enddef
def ++ 1 + enddef
def composite swap exec swap exec enddef
 
getid ++ getid *2 3 composite print /# result: 7 #/</syntaxhighlight>
<lang perl6>sub triple($n) { 3 * $n }
my $f = &triple ∘ &prefix:<-> ∘ { $^n + 2 };
say $f(5); # Prints "-21".</lang>
 
=={{header|PHP}}==
{{works with|PHP|5.3+}}
<lang php><?php
<syntaxhighlight lang="php"><?php
function compose($f, $g) {
return create_functionfunction('$x') use ($f, "$g) { return $f($g(\$x));") };
}
 
$trim_strlen = compose('strlen', 'trim');
echo $result = $trim_strlen(' Test '), "\n"; // prints 4
?></langsyntaxhighlight>
 
{{works with|PHP|5.3+}}
{{works with|PHP|pre-5.3 and 5.3+}}
<lang php><?php
works with regular functions as well as functions created by <tt>create_function()</tt>
<syntaxhighlight lang="php"><?php
function compose($f, $g) {
return functioncreate_function('$x)', use'return '.var_export($f, $gtrue) { return $f.'('.var_export($g,true).'($x)); }');
}
 
$trim_strlen = compose('strlen', 'trim');
echo $result = $trim_strlen(' Test '), "\n"; // prints 4
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de compose (F G)
(curry (F G) (X)
(F (G X)) ) )</langsyntaxhighlight>
<langsyntaxhighlight PicoLisplang="picolisp">(def 'a (compose inc dec))
(def 'b (compose 'inc 'dec))
(def 'c (compose '((A) (inc A)) '((B) (dec B))))</langsyntaxhighlight>
<langsyntaxhighlight PicoLisplang="picolisp">: (a 7)
-> 7
 
Line 1,057 ⟶ 2,617:
 
: (c 7)
-> 7</langsyntaxhighlight>
 
=={{header|PostScript}}==
<syntaxhighlight lang="postscript">
PostScript functions typically pops operand stack for argument, so calling two functions one after another naturally makes a compound function, and making a compound requires just <code>def</code>ing them:<lang PostScript>/square { dup mul } def
/compose { % f g -> { g f }
[ 3 1 roll exch
% procedures are not executed when encountered directly
% insert an 'exec' after procedures, but not after operators
1 index type /operatortype ne { /exec cvx exch } if
dup type /operatortype ne { /exec cvx } if
] cvx
} def
 
/square { dup mul } def
/plus1 { 1 add } def
/sqPlus1{ /square load /plus1 }load compose def
</syntaxhighlight>
 
=={{header|PowerShell}}==
% if the task really demands we make a function called "compose", well
You can simply call g inside f like this:
/compose { def } def % so now we can say:
<syntaxhighlight lang="powershell">
/sqPlus1 { square plus1 } compose</lang>
function g ($x) {
$x + $x
}
function f ($x) {
$x*$x*$x
}
f (g 1)
</syntaxhighlight>
 
Or g and f can become paramaters of a new function fg
 
<syntaxhighlight lang="powershell">
function fg (${function:f}, ${function:g}, $x) {
f (g $x)
}
fg f g 1
</syntaxhighlight>
 
In both cases the answer is:
<pre> 8 </pre>
 
=={{header|Prolog}}==
Works with SWI-Prolog and module lambda, written by <b>Ulrich Neumerkel</b> found there http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
<langsyntaxhighlight Prologlang="prolog">:- use_module(lambda).
 
compose(F,G, FG) :-
FG = \X^Z^(call(G,X,Y), call(F,Y,Z)).
</syntaxhighlight>
</lang>
{{out}}
Example of output :
<pre> ?- compose(sin, asin, F), call(F, 0.5, Y).
F = \_G4586^_G4589^ (call(asin,_G4586,_G4597),call(sin,_G4597,_G4589)),
Line 1,082 ⟶ 2,673:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">;Declare how our function looks like
Prototype.i Func(Arg.i)
 
Line 1,104 ⟶ 2,695:
Title$="With x="+Str(x)
Body$="Compose(f(),g(), x) ="+Str(Compose(@f(),@g(),X))
MessageRequester(Title$,Body$)</langsyntaxhighlight>
 
=={{header|Purity}}==
<syntaxhighlight lang="purity">
<lang Purity>
data compose = f => g => $f . $g
</syntaxhighlight>
</lang>
 
=={{header|Python}}==
===Simple composition of two functions===
<lang python>compose = lambda f, g: lambda x: f( g(x) )</lang>
<syntaxhighlight lang="python">compose = lambda f, g: lambda x: f( g(x) )</syntaxhighlight>
Example use:
<langsyntaxhighlight lang="python">>>> compose = lambda f, g: lambda x: f( g(x) )
>>> from math import sin, asin
>>> sin_asin = compose(sin, asin)
>>> sin_asin(0.5)
0.5
>>></langsyntaxhighlight>
 
 
Or, expanding slightly:
{{Works with|Python|3}}
<syntaxhighlight lang="python">from math import (acos, cos, asin, sin)
 
 
# compose (<<<) :: (b -> c) -> (a -> b) -> a -> c
def compose(g, f):
'''Right to left function composition.'''
return lambda x: g(f(x))
 
 
# main :: IO ()
def main():
'''Test'''
 
print(list(map(
lambda f: f(0.5),
zipWith(compose)(
[sin, cos, lambda x: x ** 3.0]
)([asin, acos, lambda x: x ** (1 / 3.0)])
)))
 
 
# GENERIC FUNCTIONS ---------------------------------------
 
 
# zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
def zipWith(f):
'''A list constructed by zipping with a
custom function, rather than with the
default tuple constructor.'''
return lambda xs: lambda ys: (
map(f, xs, ys)
)
 
 
if __name__ == '__main__':
main()</syntaxhighlight>
{{Out}}
<pre>[0.49999999999999994, 0.5000000000000001, 0.5000000000000001]</pre>
 
===Multiple composition===
Nested composition of several functions can be streamlined by using '''functools.reduce'''.
 
{{Works with|Python|3}}
<syntaxhighlight lang="python">from functools import reduce
from math import sqrt
 
 
def compose(*fs):
'''Composition, from right to left,
of an arbitrary number of functions.
'''
def go(f, g):
return lambda x: f(g(x))
 
return reduce(go, fs, lambda x: x)
 
 
# ------------------------- TEST -------------------------
def main():
'''Composition of three functions.'''
 
f = compose(
half,
succ,
sqrt
)
 
print(
f(5)
)
 
 
# ----------------------- GENERAL ------------------------
def half(n):
return n / 2
 
 
def succ(n):
return 1 + n
 
 
if __name__ == '__main__':
main()</syntaxhighlight>
{{Out}}
<pre>1.618033988749895</pre>
 
=== composition via operator overloading===
Here need composition of several functions is reduced with classes.
{{Works with|Python|3}}
<syntaxhighlight lang="python">
# Contents of `pip install compositions'
 
class Compose(object):
def __init__(self, func):
self.func = func
 
def __call__(self, x):
return self.func(x)
 
def __mul__(self, neighbour):
return Compose(lambda x: self.func(neighbour.func(x)))
 
# from composition.composition import Compose
if __name__ == "__main__":
# Syntax 1
@Compose
def f(x):
return x
 
# Syntax 2
g = Compose(lambda x: x)
 
print((f * g)(2))</syntaxhighlight>
 
=={{header|Qi}}==
Qi supports partial applications, but only when calling a function with one argument.
<syntaxhighlight lang="qi">
(define compose
F G -> (/. X
(F (G X))))
 
((compose (+ 1) (+ 2)) 3) \ (Outputs 6) \
</syntaxhighlight>
 
Alternatively, it can be done like this:
 
<syntaxhighlight lang="qi">
(define compose F G X -> (F (G X)))
 
(((compose (+ 1)) (+ 2)) 3) \ (Outputs 6) \
</syntaxhighlight>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ nested swap
nested swap join ] is compose ( g f --> [ )
 
( ----- demonstration ----- )
 
( create a named nest -- equivalent to a function )
 
[ 2 * ] is double ( n --> n )
 
( "[ 4 + ]" is an unnamed nest
-- equivalent to a lambda function. )
 
( "quoting" a nest with ' puts it on the stack
rather than it being evaluated. "do" evaluates
the top of stack. )
 
19 ' double ' [ 4 + ] compose do echo
</syntaxhighlight>
 
{{out}}
 
<pre>42</pre>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">compose <- function(f,g) function(x) { f(g(x)) }
r <- compose(sin, cos)
print(r(.5))</langsyntaxhighlight>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
(define (compose f g)
(lambda (x) (f (g x))))
</syntaxhighlight>
 
Also available as a <tt>compose1</tt> builtin, and a more general <tt>compose</tt> where one function can produce multiple arguments that are sent the the next function in the chain. (Note however that this is rarely desired.)
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|rakudo|2018.03}}
The function composition operator is <tt>∘</tt>, U+2218 RING OPERATOR (with a "Texas" version <tt>o</tt> for the Unicode challenged). Here we compose a routine, an operator, and a lambda:
<syntaxhighlight lang="raku" line>sub triple($n) { 3 * $n }
my &f = &triple ∘ &prefix:<-> ∘ { $^n + 2 };
say &f(5); # prints "-21".</syntaxhighlight>
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">REBOL [
Title: "Functional Composition"
Author: oofoe
Date: 2009-12-06
URL: http://rosettacode.org/wiki/Functional_Composition
]
Line 1,142 ⟶ 2,908:
] [
func [x] compose [(:f) (:g) x]
]</langsyntaxhighlight>
 
Functions "foo" and "bar" are used to prove that composition
actually took place by attaching their signatures to the result.
 
<langsyntaxhighlight REBOLlang="rebol">foo: func [x] [reform ["foo:" x]]
bar: func [x] [reform ["bar:" x]]
 
Line 1,154 ⟶ 2,920:
 
sin-asin: compose-functions :sine :arcsine
print [crlf "Composition of sine and arcsine:" sin-asin 0.5]</langsyntaxhighlight>
 
Output:
 
{{out}}
<pre>Composition of foo and bar: "foo: bar: test"
 
Line 1,163 ⟶ 2,928:
 
=={{header|REXX}}==
<syntaxhighlight lang="rexx">compose: procedure; parse arg f,g,x; interpret 'return' f"(" g'(' x "))"
<lang rexx>
 
compose: procedure; parse arg f,g,x; interpret 'return' f"("g'(' x "))"
exit /*control should never gets here, but this was added just in case.*/</syntaxhighlight>
 
</lang>
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Function composition
 
sumprod = func1(:func2,2,3)
see sumprod + nl
 
func func1(func2,x,y)
temp = call func2(x,y)
res = temp + x + y
return res
 
func func2(x,y)
res = x * y
return res
</syntaxhighlight>
Output:
<pre>
11
</pre>
 
=={{header|RPL}}==
{{works with|HP|48G}}
« →STR SWAP →STR +
DUP "»«" POS " " REPL STR→
» '<span style="color:blue">FCOMP</span>' STO <span style="color:grey">@ ''( « f » « g » → « f o g » )''</span>
≪ ALOG ≫ ≪ COS ≫ <span style="color:blue">FCOMP</span>
≪ ALOG ≫ ≪ COS ≫ <span style="color:blue">FCOMP</span> 0 EVAL
≪ ALOG ≫ ≪ COS ≫ <span style="color:blue">FCOMP</span> 'x' EVAL
{{out}}
<pre>
3: ≪ COS ALOG ≫
2: 10
1: 'ALOG(COS(x))'
</pre>
 
=={{header|Ruby}}==
This <tt>compose</tt> method gets passed two Method objects or Proc objects
<langsyntaxhighlight lang="ruby">def compose(f,g)
lambda {|x| f.call([g.call([x))]]}
end
s = compose(Math.method(':sin'), Math.method(':cos'))
p s.call([0.5)] # => 0.769196354841008
 
# verify
p Math.sin(Math.cos(0.5)) # => 0.769196354841008</langsyntaxhighlight>
 
=={{header|Rust}}==
With this method, you pass two symbols
In order to return a closure (anonymous function) in Stable Rust, it must be wrapped in a layer of indirection via a heap allocation. However, there is a feature coming down the pipeline (currently available in Nightly) which makes this possible. Both of the versions below are in the most general form i.e. their arguments may be functions or closures with the only restriction being that the output of <code>g</code> is the same type as the input of <code>f</code>.
<lang ruby>include Math
 
def compose(f,g)
===Stable===
lambda {|x| send(f, send(g, x))}
Function is allocated on the heap and is called via dynamic dispatch
end
<syntaxhighlight lang="rust">fn compose<'a,F,G,T,U,V>(f: F, g: G) -> Box<Fn(T) -> V + 'a>
s = compose(:sin, :cos)
where F: Fn(U) -> V + 'a,
s.call(0.5) # => 0.769196354841008</lang>
G: Fn(T) -> U + 'a,
{
Box::new(move |x| f(g(x)))
}</syntaxhighlight>
 
===Nightly===
Function is returned on the stack and is called via static dispatch (monomorphized)
<syntaxhighlight lang="rust">#![feature(conservative_impl_trait)]
fn compose<'a,F,G,T,U,V>(f: F, g: G) -> impl Fn(T) -> V + 'a
where F: Fn(U) -> V + 'a,
G: Fn(T) -> U + 'a,
{
move |x| f(g(x))
}</syntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">def compose[A](f: A => A, g: A => A) = { x: A => f(g(x)) }
 
def add1(x: Int) = x+1
val add2 = compose(add1, add1)</langsyntaxhighlight>
 
We can achieve a more natural style by creating a container class for composable functions, which provides
the compose method 'o':
 
<langsyntaxhighlight lang="scala">class Composable[A](f: A => A) {
def o (g: A => A) = compose(f, g)
}
Line 1,202 ⟶ 3,017:
implicit def toComposable[A](f: A => A) = new Composable(f)
 
val add3 = (add1 _) o add2</langsyntaxhighlight>
 
<pre>
Line 1,210 ⟶ 3,025:
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (compose f g) (lambda (x) (f (g x))))
 
;; or:
 
(define ((compose f g) x) (f (g x)))
 
</lang>
;; or to compose an arbitrary list of 1 argument functions:
 
(define-syntax compose
(lambda (x)
(syntax-case x ()
((_) #'(lambda (y) y))
((_ f) #'f)
((_ f g h ...) #'(lambda (y) (f ((compose g h ...) y)))))))
 
</syntaxhighlight>
Example:
<langsyntaxhighlight lang="scheme">
(display ((compose sin asin) 0.5))
(newline)</langsyntaxhighlight>
{{out}}
Output:
<syntaxhighlight lang="text">0.5</langsyntaxhighlight>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">func compose(f, g) {
func(x) { f(g(x)) }
}
 
var fg = compose(func(x){ sin(x) }, func(x){ cos(x) })
say fg(0.5) # => 0.76919635484100842185251475805107</syntaxhighlight>
 
=={{header|Slate}}==
Function (method) composition is standard:
<langsyntaxhighlight lang="slate">[| :x | x + 1] ** [| :x | x squared] applyTo: {3}</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
<langsyntaxhighlight lang="smalltalk">| composer fg |
composer := [ :f :g | [ :x | f value: (g value: x) ] ].
fg := composer value: [ :x | x + 1 ]
value: [ :x | x * x ].
 
(fg value:3) displayNl.</langsyntaxhighlight>
 
=={{header|Standard ML}}==
This is already defined as the '''o''' operator in Standard ML.
<langsyntaxhighlight lang="sml">fun compose (f, g) x = f (g x)</langsyntaxhighlight>
Example use:
<langsyntaxhighlight lang="sml">- fun compose (f, g) x = f (g x);
val compose = fn : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b
- val sin_asin = compose (Math.sin, Math.asin);
val sin_asin = fn : real -> real
- sin_asin 0.5;
val it = 0.5 : real</langsyntaxhighlight>
 
=={{header|SuperCollider}}==
has a function composition operator (the message `<>`):
<syntaxhighlight lang="supercollider">
f = { |x| x + 1 };
g = { |x| x * 2 };
h = g <> f;
h.(8); // returns 18
</syntaxhighlight>
 
=={{header|Swift}}==
<syntaxhighlight lang="swift">func compose<A,B,C>(f: (B) -> C, g: (A) -> B) -> (A) -> C {
return { f(g($0)) }
}
 
let sin_asin = compose(sin, asin)
println(sin_asin(0.5))</syntaxhighlight>
{{out}}
<pre>
0.5
</pre>
 
=={{header|Tcl}}==
{{works with|Tcl|8.5}}
This creates a <code>compose</code> procedure that returns an anonymous function term that should be expanded as part of application to its argument.
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
namespace path {::tcl::mathfunc}
 
Line 1,258 ⟶ 3,112:
set sin_asin [compose sin asin]
{*}$sin_asin 0.5 ;# ==> 0.5
{*}[compose abs int] -3.14 ;# ==> 3</langsyntaxhighlight>
 
=={{header|Transd}}==
<syntaxhighlight lang="Scheme">#lang transd
 
MainModule: {
// Make a short alias for a function type that takes a string and
// returns a string. Call it 'Shader'.
 
Shader: typealias(Lambda<String String>),
 
// 'composer' function takes two Shaders, combines them into
// a single Shader, which is a capturing closure, аnd returns
// this closure to the caller.
// [[f1,f2]] is a list of captured variables
 
composer: (λ f1 Shader() f2 Shader()
(ret Shader(λ[[f1,f2]] s String() (exec f1 (exec f2 s))))),
 
_start: (λ
// create a combined shader as a local variable 'render'
 
locals: render (composer
Shader(λ s String() (ret (toupper s)))
Shader(λ s String() (ret (+ s "!"))))
// call this combined shader as a usual shader with passing
// a string to it, аnd receiving from it the combined result of
// its two captured shaders
 
(textout (exec render "hello")))
}</syntaxhighlight>
{{out}}
<pre>
HELLO!
</pre>
 
=={{header|TypeScript}}==
<syntaxhighlight lang="typescript">
function compose<T, U, V> (fn1: (input: T) => U, fn2: (input: U) => V){
return function(value: T) {
return fn2(fn1(value))
}
}
 
function size (s: string): number { return s.length; }
 
function isEven(x: number): boolean { return x % 2 === 0; }
 
const evenSize = compose(size, isEven);
 
console.log(evenSize("ABCD")) // true
console.log(evenSize("ABC")) // false
</syntaxhighlight>
 
=={{header|uBasic/4tH}}==
<syntaxhighlight lang="text">Print FUNC(_Compose (_f, _g, 3))
End
 
_Compose Param (3) : Return (FUNC(a@(FUNC(b@(c@)))))
_f Param (1) : Return (a@ + 1)
_g Param (1) : Return (a@ * 2)</syntaxhighlight>
 
=={{header|UNIX Shell}}==
Each function takes its argument from standard input,
and puts its result to standard output.
Then the composition of ''f'' and ''g'' is a shell pipeline, <code>c() { g | f; }</code>.
 
{{works with|Bourne Shell}}
<syntaxhighlight lang="bash">compose() {
eval "$1() { $3 | $2; }"
}
 
downvowel() { tr AEIOU aeiou; }
upcase() { tr a-z A-Z; }
compose c downvowel upcase
echo 'Cozy lummox gives smart squid who asks for job pen.' | c
# => CoZY LuMMoX GiVeS SMaRT SQuiD WHo aSKS FoR JoB PeN.</syntaxhighlight>
 
{{works with|Bourne Again SHell}}
This solution uses no external tools, just Bash itself.
 
<syntaxhighlight lang="bash">
#compose a new function consisting of the application of 2 unary functions
 
compose () { f="$1"; g="$2"; x="$3"; "$f" "$("$g" "$x")";}
 
 
chartolowervowel()
# Usage: chartolowervowel "A" --> "a"
 
#Based on a to_upper script in Chris F. A. Johnson's book Pro Bash Programming Ch7. String Manipulation
#(with minor tweaks to use local variables and return the value of the converted character
#http://cfajohnson.com/books/cfajohnson/pbp/
#highly recommended I have a copy and have bought another for a friend
{
local LWR="";
case $1 in
A*) _LWR=a ;;
# B*) _LWR=b ;;
# C*) _LWR=c ;;
# D*) _LWR=d ;;
E*) _LWR=e ;;
# F*) _LWR=f ;;
# G*) _LWR=g ;;
# H*) _LWR=h ;;
I*) _LWR=i ;;
# J*) _LWR=j ;;
# K*) _LWR=k ;;
# L*) _LWR=L ;;
# M*) _LWR=m ;;
# N*) _LWR=n ;;
O*) _LWR=o ;;
# P*) _LWR=p ;;
# Q*) _LWR=q ;;
# R*) _LWR=r ;;
# S*) _LWR=s ;;
# T*) _LWR=t ;;
U*) _LWR=u ;;
# V*) _LWR=v ;;
# W*) _LWR=w ;;
# X*) _LWR=x ;;
# Y*) _LWR=y ;;
# Z*) _LWR=z ;;
*) _LWR=${1%${1#?}} ;;
esac;
echo "$_LWR";
}
 
strdownvowel()
# Usage: strdownvowel "STRING" --> "STRiNG"
 
#Based on an upword script in Chris F. A. Johnson's book Pro Bash Programming Ch7. String Manipulation
#(with minor tweaks to use local variables and return the value of the converted string
#http://cfajohnson.com/books/cfajohnson/pbp/
#highly recommended I have a copy and have bought another for a friend
 
{
local _DWNWORD=""
local word="$1"
while [ -n "$word" ] ## loop until nothing is left in $word
do
chartolowervowel "$word" >> /dev/null
_DWNWORD=$_DWNWORD$_LWR
word=${word#?} ## remove the first character from $word
done
Echo "$_DWNWORD"
}
 
 
 
chartoupper()
# Usage: chartoupper "s" --> "S"
 
#From Chris F. A. Johnson's book Pro Bash Programming Ch7. String Manipulation
#(with minor tweaks to use local variables and return the value of the converted character
#http://cfajohnson.com/books/cfajohnson/pbp/
#highly recommended I have a copy and have bought another for a friend
{
local UPR="";
case $1 in
a*) _UPR=A ;;
b*) _UPR=B ;;
c*) _UPR=C ;;
d*) _UPR=D ;;
e*) _UPR=E ;;
f*) _UPR=F ;;
g*) _UPR=G ;;
h*) _UPR=H ;;
i*) _UPR=I ;;
j*) _UPR=J ;;
k*) _UPR=K ;;
l*) _UPR=L ;;
m*) _UPR=M ;;
n*) _UPR=N ;;
o*) _UPR=O ;;
p*) _UPR=P ;;
q*) _UPR=Q ;;
r*) _UPR=R ;;
s*) _UPR=S ;;
t*) _UPR=T ;;
u*) _UPR=U ;;
v*) _UPR=V ;;
w*) _UPR=W ;;
x*) _UPR=X ;;
y*) _UPR=Y ;;
z*) _UPR=Z ;;
*) _UPR=${1%${1#?}} ;;
esac;
echo "$_UPR";
}
 
strupcase()
# Usage: strupcase "string" --> "STRING"
 
#Based on an upword script in Chris F. A. Johnson's book Pro Bash Programming Ch7. String Manipulation
#(with minor tweaks to use local variables and return the value of the converted string
#http://cfajohnson.com/books/cfajohnson/pbp/
#highly recommended I have a copy and have bought another for a friend
 
{
local _UPWORD=""
local word="$1"
while [ -n "$word" ] ## loop until nothing is left in $word
do
chartoupper "$word" >> /dev/null
_UPWORD=$_UPWORD$_UPR
word=${word#?} ## remove the first character from $word
done
Echo "$_UPWORD"
}
 
compose strdownvowel strupcase "Cozy lummox gives smart squid who asks for job pen."
# --> CoZY LuMMoX GiVeS SMaRT SQuiD WHo aSKS FoR JoB PeN.</syntaxhighlight>
 
 
==={{header|es}}===
With shell pipelines:
 
<syntaxhighlight lang="es">fn compose f g {
result @ {$g | $f}
}
 
fn downvowel {tr AEIOU aeiou}
fn upcase {tr a-z A-Z}
fn-c = <={compose $fn-downvowel $fn-upcase}
echo 'Cozy lummox gives smart squid who asks for job pen.' | c
# => CoZY LuMMoX GiVeS SMaRT SQuiD WHo aSKS FoR JoB PeN.</syntaxhighlight>
 
With function arguments:
 
<syntaxhighlight lang="es">fn compose f g {
result @ x {result <={$f <={$g $x}}}
}
 
fn downvowel x {result `` '' {tr AEIOU aeiou <<< $x}}
fn upcase x {result `` '' {tr a-z A-Z <<< $x}}
fn-c = <={compose $fn-downvowel $fn-upcase}
echo <={c 'Cozy lummox gives smart squid who asks for job pen.'}
# => CoZY LuMMoX GiVeS SMaRT SQuiD WHo aSKS FoR JoB PeN.</syntaxhighlight>
 
=={{header|Unlambda}}==
Line 1,269 ⟶ 3,368:
for functions f and g, hence hardly worth defining. However, it could
be defined without using the operator like this.
<langsyntaxhighlight Ursalalang="ursala">compose("f","g") "x" = "f" "g" "x"</langsyntaxhighlight>
test program:
<langsyntaxhighlight Ursalalang="ursala">#import nat
#cast %n
 
test = compose(successor,double) 3</langsyntaxhighlight>
{{out}}
output:
<pre>7</pre>
 
Line 1,285 ⟶ 3,384:
 
'''Implementation'''
<syntaxhighlight lang="vb">
<lang vb>
option explicit
class closure
Line 1,304 ⟶ 3,403:
end class
</syntaxhighlight>
</lang>
 
'''Invocation'''
<syntaxhighlight lang="vb">
<lang vb>
dim c
set c = new closure
Line 1,334 ⟶ 3,433:
wscript.echo c.formula
wscript.echo c(12.3)
</syntaxhighlight>
</lang>
 
{{out}}
'''Output'''
<pre>
lcase(ucase(p1))
Line 1,347 ⟶ 3,446:
25.6
</pre>
 
=={{header|WDTE}}==
 
The simplest way is with a lambda:
 
<syntaxhighlight lang="wdte">let compose f g => (@ c x => g x -> f);</syntaxhighlight>
 
Alternatively, you can take advantage of partial function calls:
 
<syntaxhighlight lang="wdte">let compose f g x => g x -> f;</syntaxhighlight>
 
Both can be used as follows:
 
<syntaxhighlight lang="wdte">(compose (io.writeln io.stdout) !) true;</syntaxhighlight>
 
Output:
 
<syntaxhighlight lang="wdte">false</syntaxhighlight>
 
=={{header|Wortel}}==
The <code>@</code> operator applied to a array literal will compose the functions in the array and <code>^</code> with a group literal will do the same, but also quotes operators.
<syntaxhighlight lang="wortel">! @[f g] x ; f(g(x))</syntaxhighlight>
<syntaxhighlight lang="wortel">! ^(f g) x ; f(g(x))</syntaxhighlight>
Defining the <code>compose</code> function
<syntaxhighlight lang="wortel">@var compose &[f g] &x !f!g x</syntaxhighlight>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var compose = Fn.new { |f, g| Fn.new { |x| f.call(g.call(x)) } }
 
var double = Fn.new { |x| 2 * x }
 
var addOne = Fn.new { |x| x + 1 }
 
System.print(compose.call(double, addOne).call(3))</syntaxhighlight>
 
{{out}}
<pre>
8
</pre>
 
=={{header|zkl}}==
<syntaxhighlight lang="zkl">Utils.Helpers.fcomp('+(1),'*(2))(5) //-->11</syntaxhighlight>
Which is implemented with a closure (.fp1), which fixes the second paramter
<syntaxhighlight lang="zkl">fcn fcomp(f,g,h,etc){
{ fcn(x,hgf){ T(x).pump(Void,hgf.xplode()) }.fp1(vm.arglist.reverse()); }</syntaxhighlight>
 
=={{header|ZX Spectrum Basic}}==
DEF FN commands can be nested, making this appear trivial:
<syntaxhighlight lang="zxbasic">10 DEF FN f(x)=SQR x
20 DEF FN g(x)=ABS x
30 DEF FN c(x)=FN f(FN g(x))
40 PRINT FN c(-4)</syntaxhighlight>
Which gets you f(g(x)), for sure. But if you want g(f(x)) you need to DEF a whole new FN. Instead we can pass the function names as strings to a new function and numerically evaluate the string:
<syntaxhighlight lang="zxbasic">10 DEF FN f(x)=SQR x
20 DEF FN g(x)=ABS x
30 DEF FN c(a$,b$,x)=VAL ("FN "+a$+"(FN "+b$+"(x))")
40 PRINT FN c("f","g",-4)
50 PRINT FN c("g","f",-4)</syntaxhighlight>
{{out}}
<pre>2
 
A Invalid argument, 50:1</pre>
543

edits