User:Coderjoe/Sandbox2: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
=={{header|Groovy}}==
Solution:
<lang groovy>def compose = { f, g -> { x -> f(g(x)) } }</lang>

Test program:
<lang groovy>def cube = { it * it * it }
def cubeRoot = { it ** (1/3) }

funcList = [ Math.&sin, Math.&cos, cube ]
inverseList = [ Math.&asin, Math.&acos, cubeRoot ]

println [funcList, inverseList].transpose().collect { compose(it[0],it[1]) }.collect{ it(0.5) }
println [inverseList, funcList].transpose().collect { compose(it[0],it[1]) }.collect{ it(0.5) }</lang>

Output:
<pre>[0.5, 0.4999999999999999, 0.5000000000346574]
[0.5, 0.4999999999999999, 0.5000000000346574]</pre>

=={{header|Haskell}}==
<lang haskell>Prelude> let cube x = x ^ 3
Prelude> let croot x = x ** (1/3)
Prelude> let compose f g = \x -> f (g x) -- this is already implemented in Haskell as the "." operator
Prelude> -- we could have written "let compose f g x = f (g x)" but we show this for clarity
Prelude> let funclist = [sin, cos, cube]
Prelude> let funclisti = [asin, acos, croot]
Prelude> zipWith (\f inversef -> (compose inversef f) 0.5) funclist funclisti
[0.5,0.4999999999999999,0.5]</lang>

=={{header|Icon}} and {{header|Unicon}}==
The Unicon solution can be modified to work in Icon. See [[Function_composition#Icon_and_Unicon]].
<lang Unicon>link compose
procedure main(arglist)

fun := [sin,cos,cube]
inv := [asin,acos,cuberoot]
x := 0.5
every i := 1 to *inv do
write("f(",x,") := ", compose(inv[i],fun[i])(x))
end

procedure cube(x)
return x*x*x
end

procedure cuberoot(x)
return x ^ (1./3)
end</lang>
Please refer to See [[Function_composition#Icon_and_Unicon]] for 'compose'.

Sample Output:
<pre>f(0.5) := 0.5
f(0.5) := 0.4999999999999999
f(0.5) := 0.5</pre>

=={{header|J}}==
J has some subtleties which are not addressed in this specification (J functions have grammatical character and their [[wp:Gerund|gerundial form]] may be placed in data structures where the spec sort of implies that there be no such distinction).

However, here are the basics which were requested:
<lang j> sin=: 1&o.
cos=: 2&o.
cube=: ^&3
square=: *:
unqo=: `:6
unqcol=: `:0
quot=: 1 :'{.u`'''''
A=: sin`cos`cube`square
B=: monad def'y unqo inv quot'"0 A
BA=. A dyad def'x unqo@(y unqo) quot'"0 B</lang>

<lang> A unqcol 0.5
0.479426 0.877583 0.125 0.25
BA unqcol 0.5
0.5 0.5 0.5 0.5</lang>

=={{header|Java}}==
Java doesn't technically have first-class functions. Java can simulate first-class functions to a certain extent, with anonymous classes and generic function interface.

<lang java>
public static Function<Double, Double> compose(
final Function<Double, Double> f, final Function<Double, Double> g) {
return new Function<Double, Double>() {
@Override public Double apply(Double x) {
return f.apply(g.apply(x));
}
};
}

@SuppressWarnings("unchecked") public static void main(String[] args) {
ArrayList<Function<Double, Double>> functions = Lists.newArrayList(
new Function<Double, Double>() {
@Override public Double apply(Double x) {
return Math.cos(x);
}
}, new Function<Double, Double>() {
@Override public Double apply(Double x) {
return Math.tan(x);
}
}, new Function<Double, Double>() {
@Override public Double apply(Double x) {
return x * x;
}
});
ArrayList<Function<Double, Double>> inverse = Lists.newArrayList(
new Function<Double, Double>() {
@Override public Double apply(Double x) {
return Math.acos(x);
}
}, new Function<Double, Double>() {
@Override public Double apply(Double x) {
return Math.atan(x);
}
}, new Function<Double, Double>() {
@Override public Double apply(Double x) {
return Math.sqrt(x);
}
});
for (int i = 0; i < functions.size(); i++) {
System.out.println(compose(functions.get(i), inverse.get(i)).apply(0.5));
}
}
</lang>
=={{header|JavaScript}}==
assuming the print function is provided by the environment, like a stand-alone shell. In browsers, use alert(), document.write() or similar

<lang javascript>var compose = function (f, g) {
return function (x) {
return f(g(x));
};
};

var fn = [Math.sin, Math.cos, function (x) { return Math.pow(x, 3); }];
var inv = [Math.asin, Math.acos, function (x) { return Math.pow(x, 1/3); }];

(function () {
for (var i = 0; i < 3; i++) {
var f = compose(inv[i], fn[i]);
print(f(0.5)); // 0.5
}
})();

</lang>

=={{header|Lua}}==
<lang lua> function compose(f,g) return function(...) return f(g(...)) end end

fn = {math.sin, math.cos, function(x) return x^3 end}
inv = {math.asin, math.acos, function(x) return x^(1/3) end}

for i, v in ipairs(fn)
local f = compose(v, inv[i])
print(f(0.5)) --> 0.5
end</lang>

=={{header|Mathematica}}==
The built-in function Composition can do composition, a custom function that does the same would be compose[f_,g_]:=f[g[#]]&. However the latter only works with 2 arguments, Composition works with any number of arguments.
<lang Mathematica>funcs = {Sin, Cos, #^3 &};
funcsi = {ArcSin, ArcCos, #^(1/3) &};
compositefuncs = Composition @@@ Transpose[{funcs, funcsi}];
Table[i[0.666], {i, compositefuncs}]</lang>
gives back:
<lang Mathematica>{0.666, 0.666, 0.666}</lang>
Note that I implemented cube and cube-root as pure functions. This shows that Mathematica is fully able to handle functions as variables, functions can return functions, and functions can be given as an argument. Composition can be done in more than 1 way:
<lang Mathematica>Composition[f,g,h][x]
f@g@h@x
x//h//g//f</lang>
all give back:
<lang Mathematica>f[g[h[x]]]</lang>

=={{header|Nemerle}}==
{{trans|Python}}
<lang Nemerle>using System;
using System.Console;
using System.Math;
using Nemerle.Collections.NCollectionsExtensions;

module FirstClassFunc
{
Main() : void
{
def cube = fun (x) {x * x * x};
def croot = fun (x) {Pow(x, 1.0/3.0)};
def compose = fun(f, g) {fun (x) {f(g(x))}};
def funcs = [Sin, Cos, cube];
def ifuncs = [Asin, Acos, croot];
WriteLine($[compose(f, g)(0.5) | (f, g) in ZipLazy(funcs, ifuncs)]);
}
}</lang>

=={{header|newLISP}}==
<lang newLISP>> (define (compose f g) (expand (lambda (x) (f (g x))) 'f 'g))
(lambda (f g) (expand (lambda (x) (f (g x))) 'f 'g))
> (define (cube x) (pow x 3))
(lambda (x) (pow x 3))
> (define (cube-root x) (pow x (div 1 3)))
(lambda (x) (pow x (div 1 3)))
> (define functions '(sin cos cube))
(sin cos cube)
> (define inverses '(asin acos cube-root))
(asin acos cube-root)
> (map (fn (f g) ((compose f g) 0.5)) functions inverses)
(0.5 0.5 0.5)
</lang>

=={{header|OCaml}}==
<lang ocaml># let cube x = x ** 3. ;;
val cube : float -> float = <fun>

# let croot x = x ** (1. /. 3.) ;;
val croot : float -> float = <fun>

# let compose f g = fun x -> f (g x) ;; (* we could have written "let compose f g x = f (g x)" but we show this for clarity *)
val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>

# let funclist = [sin; cos; cube] ;;
val funclist : (float -> float) list = [<fun>; <fun>; <fun>]

# let funclisti = [asin; acos; croot] ;;
val funclisti : (float -> float) list = [<fun>; <fun>; <fun>]

# List.map2 (fun f inversef -> (compose inversef f) 0.5) funclist funclisti ;;
- : float list = [0.5; 0.499999999999999889; 0.5]</lang>

=={{header|Octave}}==
<lang octave>function r = cube(x)
r = x.^3;
endfunction

function r = croot(x)
r = x.^(1/3);
endfunction

compose = @(f,g) @(x) f(g(x));

f1 = {@sin, @cos, @cube};
f2 = {@asin, @acos, @croot};

for i = 1:3
disp(compose(f1{i}, f2{i})(.5))
endfor</lang>


=={{header|Oz}}==
To be executed in the REPL.

<lang oz>declare

fun {Compose F G}
fun {$ X}
{F {G X}}
end
end

fun {Cube X} X*X*X end

fun {CubeRoot X} {Number.pow X 1.0/3.0} end

in

for
F in [Float.sin Float.cos Cube]
I in [Float.asin Float.acos CubeRoot]
do
{Show {{Compose I F} 0.5}}
end
</lang>

=={{header|PARI/GP}}==
{{works with|PARI/GP|2.4.2 and above}}
<lang parigp>compose(f,g)={
<lang parigp>compose(f,g)={
x -> f(g(x))
x -> f(g(x))
Line 282: Line 14:
<lang parigp> A=[sin, cos, x->x^2];
<lang parigp> A=[sin, cos, x->x^2];
B=[asin, acos, x->sqrt(x)];</lang>
B=[asin, acos, x->sqrt(x)];</lang>

=={{header|Perl}}==
<lang perl>use Math::Complex ':trig';

sub compose {
my ($f, $g) = @_;
sub {
$f -> ($g -> (@_));
};
}

my $cube = sub { $_[0] ** (3) };
my $croot = sub { $_[0] ** (1/3) };

my @flist1 = ( \&Math::Complex::sin, \&Math::Complex::cos, $cube );
my @flist2 = ( \&asin, \&acos, $croot );

print join "\n", map {
compose($flist1[$_], $flist2[$_]) -> (0.5)
} 0..2;</lang>

=={{header|Perl 6}}==
{{works with|Rakudo|2011.06}}

<lang perl6>sub compose (&g, &f) { return { g f $^x } }

my $x = *.sin;
my $xi = *.asin;
my $y = *.cos;
my $yi = *.acos;
my $z = * ** 3;
my $zi = * ** (1/3);
my @functions = $x, $y, $z;
my @inverses = $xi, $yi, $zi;
for @functions Z @inverses { say compose($^g, $^f)(.5) }</lang>
Output:
<pre>0.5
0.5
0.5</pre>

Latest revision as of 20:38, 16 July 2011

<lang parigp>compose(f,g)={

 x -> f(g(x))

};

fcf()={

 my(A,B);
 A=[x->sin(x), x->cos(x), x->x^2];
 B=[x->asin(x), x->acos(x), x->sqrt(x)];
 for(i=1,#A,
   print(compose(A[i],B[i])(.5))
 )

};</lang> Usage note: In Pari/GP 2.4.3 the vectors can be written as <lang parigp> A=[sin, cos, x->x^2];

 B=[asin, acos, x->sqrt(x)];</lang>