First-class functions

From Rosetta Code
Revision as of 00:51, 23 July 2010 by 216.156.98.230 (talk) (→‎{{header|C++}}: C++0x example)
Task
First-class functions
You are encouraged to solve this task according to the task description, using any language you may know.

A language has first-class functions if it can do each of the following without recursively invoking a compiler or interpreter or otherwise metaprogramming:

  • Create new functions from preexisting functions at run-time
  • Store functions in collections
  • Use functions as arguments to other functions
  • Use functions as return values of other functions

Write a program to create an ordered collection A of functions of a real number. At least one function should be built-in and at least one should be user-defined; try using the sine, cosine, and cubing functions. Fill another collection B with the inverse of each function in A. Implement function composition as in Functional Composition. Finally, demonstrate that the result of applying the composition of each function in A and its inverse in B to a value, is the original value. (Within the limits of computational accuracy).

(A solution need not actually call the collections "A" and "B". These names are only used in the preceding paragraph for clarity.)

C.f. First-class Numbers

ActionScript

Translation of: JavaScript

<lang ActionScript>function compose(f:Function, g:Function):Function { return function(x:Number) {return f(g(x));}; } var functions:Array = [Math.cos, Math.tan, function(x:Number){return x*x;}]; var inverse:Array = [Math.acos, Math.atan, function(x:Number){return Math.sqrt(x);}];

function test() { for (var i:uint = 0; i < functions.length; i++) { trace(compose(functions[i], inverse[i])(0.5)); } }</lang>

Aikido

Translation of: Javascript

<lang aikido> import math

function compose (f, g) {

   return function (x) { return f(g(x)) }

}

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

for (var i=0; i<3; i++) {

   var f = compose(inv[i], fn[i])
   println(f(0.5))    // 0.5

}

</lang>

ALGOL 68

Translation of: Python
Works with: ALGOL 68 version Standard - no extensions to language used
Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9.i386
Works with: ELLA ALGOL 68 version Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386 using non-standard compose

Note: Returning PROC (REAL x)REAL: f1(f2(x)) from a function apparently violates standard ALGOL 68's scoping rules. ALGOL 68G warns about this during parsing, and then - if run out of scope - rejects during runtime. <lang algol68>MODE F = PROC (REAL)REAL; OP ** = (REAL x, power)REAL: exp(ln(x)*power);

  1. Add a user defined function and its inverse #

PROC cube = (REAL x)REAL: x * x * x; PROC cube root = (REAL x)REAL: x ** (1/3);

  1. First class functions allow run-time creation of functions from functions #
  2. return function compose(f,g)(x) == f(g(x)) #

PROC non standard compose = (F f1, f2)F: (REAL x)REAL: f1(f2(x)); # eg ELLA ALGOL 68RS # PROC compose = (F f, g)F: ((F f2, g2, REAL x)REAL: f2(g2(x)))(f, g, );

  1. Or the classic "o" functional operator #

PRIO O = 5; OP (F,F)F O = compose;

  1. first class functions should be able to be members of collection types #

[]F func list = (sin, cos, cube); []F arc func list = (arc sin, arc cos, cube root);

  1. Apply functions from lists as easily as integers #

FOR index TO UPB func list DO

 STRUCT(F f, inverse f) this := (func list[index], arc func list[index]);
 print(((inverse f OF this O f OF this)(.5), new line))

OD</lang> Output:

+.500000000000000e +0
+.500000000000000e +0
+.500000000000000e +0

AutoHotkey

AutoHotkey core does not support new function definitions at run time.
However, functions can be called by name, so mapping functions is possible: <lang AutoHotkey>forward := "sin,cube,cos" inverse := "Asin,cuberoot,Acos" StringSplit, forward, forward, `,  ; store array length in forward0 StringSplit, inverse, inverse, `,  ; array contents are in inverse1, inverse2... Loop, % forward0

 MsgBox % map(compose(forward%A_Index%, inverse%A_Index%), 0.500)

Return

compose(f, g){

 Return map(0, 0, f, g)

}

map(ab = 0, x = 0 , a = 0, b = 0) {

 Static
 If (a And b)
   Return a . "`n" . b
 If ab
 {
   StringSplit, ab, ab, `n
   Return %ab1%(%ab2%(x))
 }

}

cube(x){

 Return x ** 3

}

cuberoot(x){

 Return x ** (1 / 3) 

}</lang>

C

Since one can't create new functions dynamically within a C program, C doesn't have first class functions. But you can pass references to functions as parameters and return values and you can have a list of function references, so I guess you can say C has second class functions.

Here goes.

<lang c>#include <stdlib.h>

  1. include <stdio.h>
  2. include <math.h>

/* declare a typedef for a function pointer */ typedef double (*Class2Func)(double);

/*A couple of functions with the above prototype */ double functionA( double v) {

  return v*v*v;

} double functionB(double v) {

  return exp(log(v)/3);

}

/* A function taking a function as an argument */ double Function1( Class2Func f2, double val ) {

   return f2(val);

}

/*A function returning a function */ Class2Func WhichFunc( int idx) {

  return (idx < 4) ? &functionA : &functionB;

}

/* A list of functions */ Class2Func funcListA[] = {&functionA, &sin, &cos, &tan }; Class2Func funcListB[] = {&functionB, &asin, &acos, &atan };

/* Composing Functions */ double InvokeComposed( Class2Func f1, Class2Func f2, double val ) {

  return f1(f2(val));

}

typedef struct sComposition {

  Class2Func f1;
  Class2Func f2;

} *Composition;

Composition Compose( Class2Func f1, Class2Func f2) {

  Composition comp = malloc(sizeof(struct sComposition));
  comp->f1 = f1;
  comp->f2 = f2;
  return comp;

}

double CallComposed( Composition comp, double val ) {

   return comp->f1( comp->f2(val) );

} /** * * * * * * * * * * * * * * * * * * * * * * * * * * */

int main(int argc, char *argv[]) {

  int ix;
  Composition c;

  printf("Function1(functionA, 3.0) = %f\n", Function1(WhichFunc(0), 3.0));

  for (ix=0; ix<4; ix++) {
      c = Compose(funcListA[ix], funcListB[ix]);
      printf("Compostion %d(0.9) = %f\n", ix, CallComposed(c, 0.9));
  }

  return 0;

}</lang>

C++

This uses many C++0x niceties so make sure you put your compiler in the correct mode.

<lang cpp>

  1. include <tr1/functional>
  2. include <vector>
  3. include <iostream>
  4. include <cmath>

using std::vector; using std::cout; using std::endl; using std::tr1::function;

vector<double(*)(double)> A = {sin, cos, tan}; vector<double(*)(double)> B = {asin, acos, atan};

template <typename A, typename B, typename... Params> function<A(Params...)> compose(A(*f)(B), B(*g)(Params...)){

   return [=](Params... args){ return f(g(args...)); };

}

  1. define PRINT(x) cout << #x ": " << (x) << endl;

int main() {

   double num = 1 / 3.14159;
   
   PRINT(num);
   PRINT(compose(B[0], A[0])(num));
   PRINT(compose(B[1], A[1])(num));
   PRINT(compose(B[2], A[2])(num));
   auto identity = compose(log10, pow);
   PRINT(identity(10, num));

} </lang>

Common Lisp

<lang lisp>(defun compose (f g) (lambda (x) (funcall f (funcall g x)))) (defun cube (x) (expt x 3)) (defun cube-root (x) (expt x (/ 3)))

(loop with value = 0.5

     for function in (list #'sin  #'cos  #'cube     )
     for inverse  in (list #'asin #'acos #'cube-root)
     for composed = (compose inverse function)
     do (format t "~&(~A ∘ ~A)(~A) = ~A~%"
                inverse
                function
                value 
                (funcall composed value)))</lang>

Output:

<lang lisp>(#<FUNCTION ASIN> ∘ #<FUNCTION SIN>)(0.5) = 0.5 (#<FUNCTION ACOS> ∘ #<FUNCTION COS>)(0.5) = 0.5 (#<FUNCTION CUBE-ROOT> ∘ #<FUNCTION CUBE>)(0.5) = 0.5</lang>

D

D 2.0 version of compose function (template). <lang D>import std.stdio; import std.math;

T delegate(S) compose(T, U, S)(T delegate(U) f, U delegate(S) g) {

   return (S s) { return f(g(s)); };

}</lang>

Compose working both in D 1.0 and 2.0: <lang D>T delegate(S) compose(T, U, S)(T delegate(U) f, U delegate(S) g) {

   struct Wrapper {
       typeof(f) fcp;
       typeof(g) gcp;
       T foobar(S s) { return fcp(gcp(s)); }
   }
   Wrapper* hold = new Wrapper;
   hold.fcp = f;
   hold.gcp = g;
   return &hold.foobar;

}</lang>

Example:

<lang D>void main() {

   auto sinwrp   = delegate (real x){ return sin(x);};
   auto coswrp   = delegate (real x){ return cos(x);};
   auto sincos_n = delegate (real x) { return sin(cos(x)); };
   auto sincos_r = compose(sinwrp, coswrp);
   auto funcTbl  = cast(real delegate(real) [])[sinwrp, coswrp, sincos_n, sincos_r];
   for (int i = 1; i <= 10; i++) {
       real arg = (i*2.0*PI) / 10.0;
       foreach (f; funcTbl)
           writef ("%10f ", f(arg));
       writefln("");
   }

}</lang>

E

First, a brief summary of the relevant semantics: In E, every value, including built-in and user-defined functions, "is an object" — it has methods which respond to messages. Methods are distinguished by the given name (verb) and the number of parameters (arity). By convention and syntactic sugar, a function is an object which has a method whose verb is "run".

The relevant mathematical operations are provided as methods on floats, so the first thing we must do is define them as functions.

<lang e>def sin(x) { return x.sin() } def cos(x) { return x.cos() } def asin(x) { return x.asin() } def acos(x) { return x.acos() } def cube(x) { return x ** 3 } def curt(x) { return x ** (1/3) }

def forward := [sin, cos, cube] def reverse := [asin, acos, curt]</lang>

There are no built-in functions in this list, since the original author couldn't easily think of any which had one parameter and were inverses of each other, but composition would work just the same with them.

Defining composition. fn params { expr } is shorthand for an anonymous function returning a value. <lang e>def compose(f, g) {

   return fn x { f(g(x)) }

}</lang>

<lang e>? def x := 0.5 \ > for i => f in forward { > def g := reverse[i] > println(`x = $x, f = $f, g = $g, compose($f, $g)($x) = ${compose(f, g)(x)}`) > }

x = 0.5, f = <sin>, g = <asin>, compose(<sin>, <asin>)(0.5) = 0.5 x = 0.5, f = <cos>, g = <acos>, compose(<cos>, <acos>)(0.5) = 0.4999999999999999 x = 0.5, f = <cube>, g = <curt>, compose(<cube>, <curt>)(0.5) = 0.5000000000000001</lang>

Note: def g := reverse[i] is needed here because E as yet has no defined protocol for iterating over collections in parallel. Page for this issue.

Factor

<lang factor>USING: assocs combinators kernel math.functions prettyprint sequences ; IN: rosettacode.first-class-functions

CONSTANT: A { [ sin ] [ cos ] [ 3 ^ ] } CONSTANT: B { [ asin ] [ acos ] [ 1/3 ^ ] }

compose-all ( seq1 seq2 -- seq ) [ compose ] 2map ;
test1 ( -- )
   0.5 A B compose-all
   [ call( x -- y ) ] with map . ;</lang>

Forth

<lang forth>: compose ( xt1 xt2 -- xt3 )

 >r >r :noname
    r> compile,
    r> compile,
    postpone ;
cube fdup fdup f* f* ;
cuberoot 1e 3e f/ f** ;
table create does> swap cells + @ ;

table fn ' fsin , ' fcos , ' cube , table inverse ' fasin , ' facos , ' cuberoot ,

main
 3 0 do
   i fn i inverse compose  ( xt )
   0.5e execute f.
 loop ;

main \ 0.5 0.5 0.5</lang>

Go

<lang go>package main import "math" import "fmt"

func cube(x float64) float64 { return math.Pow(x, 3) }

// Go doesn't have generics; this compose function just composes float functions func compose(f, g func(float64) float64) func(float64) float64 {

 return func(x float64) float64 {
   return f(g(x))
 }

}

func main() {

 funclist := [3]func(float64) float64 { math.Sin, math.Cos, cube }
 funclisti := [3]func(float64) float64 { math.Asin, math.Acos, math.Cbrt }
 for i := 0; i < 3; i++ {
   fmt.Println(compose(funclisti[i], funclist[i])(0.5))
 }

}</lang>

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 GroovyCollections.transpose( [funcList, inverseList] ).collect { compose(it[0],it[1]) }.collect{ it(0.5) } println GroovyCollections.transpose( [inverseList, funcList] ).collect { compose(it[0],it[1]) }.collect{ it(0.5) }</lang>

Output:

[0.5, 0.4999999999999999, 0.5000000000346574]
[0.5, 0.4999999999999999, 0.5000000000346574]

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>

Icon and Unicon

Icon

The Unicon solution can be modified to work in Icon. See Function_composition#Icon_and_Unicon.

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:

f(0.5) := 0.5
f(0.5) := 0.4999999999999999
f(0.5) := 0.5

J

J has some subtleties which are not addressed in this specification (functions have grammatical character and their gerundial form may be placed in data structures).

However, here are the basics which were requested: <lang j> sin=: 1&o. asin=: _1&o.

cos=:  2&o.

acos=: _2&o. cube=: ^&3 cuberoot=: ^&1r3</lang>

<lang j> compose=: @

  (sin compose asin) 0.7

0.7

  (acos compose cos) 0.7

0.7

  (cube compose cuberoot) 0.7

0.7</lang>

JavaScript

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

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

test() {

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

}</lang>

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>

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>

OCaml

<lang ocaml># let cube x = x ** 3. ;; val cube : float -> float = <fun>

  1. let croot x = x ** (1. /. 3.) ;;

val croot : float -> float = <fun>

  1. 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>

  1. let funclist = [sin; cos; cube] ;;

val funclist : (float -> float) list = [<fun>; <fun>; <fun>]

  1. let funclisti = [asin; acos; croot] ;;

val funclisti : (float -> float) list = [<fun>; <fun>; <fun>]

  1. List.map2 (fun f inversef -> (compose inversef f) 0.5) funclist funclisti ;;

- : float list = [0.5; 0.499999999999999889; 0.5]</lang>

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>


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>


Perl

<lang perl>use Math::Complex ':trig';

my $cube = sub {shift()**3}; my $croot = sub {shift()**(1/3)};

sub compose

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

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

foreach (0 .. $#flist1)

  {print compose($flist1[$_], $flist2[$_])->(.5), "\n";}</lang>

Perl 6

Works with: Rakudo version #22 "Thousand Oaks"

<lang perl6>my $cube = * ** 3; &croot = * ** (1/3); # Equivalent to 'sub croot ($x) { $x**(1/3) }'

sub compose ($f, $g) { return { $f($g($^x)) } }

my @functions = &sin, &cos, $cube; my @inverses = &asin, &acos, &croot;

{ say compose($^g, $^f)(.5) } for @functions Z @inverses;</lang>

PicoLisp

<lang PicoLisp>(load "@lib/math.l")

(de compose (F G)

  (list '(X) (list F (list G 'X))) )

(de cube (X)

  (pow X 3.0) )

(de cubeRoot (X)

  (pow X 0.3333333) )

(mapc

  '((Fun Inv)
     (prinl (format ((compose Inv Fun) 0.5) *Scl)) )
  '(sin  cos  cube)
  '(asin acos cubeRoot) )</lang>

Output:

0.500001
0.499999
0.500000

Python

<lang python>>>> # Some built in functions and their inverses >>> from math import sin, cos, acos, asin >>> # Add a user defined function and its inverse >>> cube = lambda x: x * x * x >>> croot = lambda x: x ** (1/3.0) >>> # First class functions allow run-time creation of functions from functions >>> # return function compose(f,g)(x) == f(g(x)) >>> compose = lambda f1, f2: ( lambda x: f1(f2(x)) ) >>> # first class functions should be able to be members of collection types >>> funclist = [sin, cos, cube] >>> funclisti = [asin, acos, croot] >>> # Apply functions from lists as easily as integers >>> [compose(inversef, f)(.5) for f, inversef in zip(funclist, funclisti)] [0.5, 0.4999999999999999, 0.5] >>></lang>

R

<lang R>cube <- function(x) x^3 croot <- function(x) x^(1/3) compose <- function(f, g) function(x){f(g(x))}

f1 <- c(sin, cos, cube) f2 <- c(asin, acos, croot)

for(i in 1:3) {

 print(compose(f1i, f2i)(.5))

}</lang>

Alternatively:

<lang R> sapply(mapply(compose,f1,f2),do.call,list(.5)) </lang>

REBOL

<lang REBOL>REBOL [ Title: "First Class Functions" Author: oofoe Date: 2009-12-05 URL: http://rosettacode.org/wiki/First-class_functions ]

Functions "foo" and "bar" are used to prove that composition
actually took place by attaching their signatures to the result.

foo: func [x][reform ["foo:" x]] bar: func [x][reform ["bar:" x]]

cube: func [x][x * x * x] croot: func [x][power x 1 / 3]

"compose" means something else in REBOL, so I "fashion" an alternative.

fashion: func [f1 f2][ do compose/deep [func [x][(:f1) (:f2) x]]]

A: [foo sine cosine cube] B: [bar arcsine arccosine croot]

while [not tail? A][ fn: fashion get A/1 get B/1 source fn ; Prove that functions actually got composed. print [fn 0.5 crlf]

A: next A B: next B  ; Advance to next pair. ]</lang>

Ruby

<lang ruby>irb(main):001:0> cube = proc {|x| x ** 3} => #<Proc:0xb7cac4b8@(irb):1> irb(main):002:0> croot = proc {|x| x ** (1/3.0)} => #<Proc:0xb7ca40d8@(irb):2> irb(main):003:0> compose = proc {|f,g| proc {|x| f[g[x]]}} => #<Proc:0xb7c9996c@(irb):3> irb(main):004:0> funclist = [Math.method(:sin).to_proc, Math.method(:cos).to_proc, cube] => [#<Proc:0xb7c84be8@(irb):4>, #<Proc:0xb7c84bac@(irb):4>, #<Proc:0xb7cac4b8@(irb):1>] irb(main):005:0> funclisti = [Math.method(:asin).to_proc, Math.method(:acos).to_proc, croot] => [#<Proc:0xb7c7a88c@(irb):5>, #<Proc:0xb7c7a850@(irb):5>, #<Proc:0xb7ca40d8@(irb):2>] irb(main):006:0> funclist.zip(funclisti).map {|f,inversef| compose[inversef, f][0.5] } => [0.5, 0.5, 0.5]</lang>

Scala

<lang scala>def cube = (x:Double) => x*x*x def cuberoot = (x:Double) => Math.pow(x,1.0/3)

def compose[A,B,C](f:B=>C,g:A=>B) = (x:A)=>f(g(x))

def fun = List(Math.sin _, Math.cos _, cube) def inv = List(Math.asin _, Math.acos _, cuberoot)

def comp = fun.zip(inv).map{case (a,b)=>compose(a,b)}

comp.foreach(f=>println(f(0.5)))</lang>

Here's how you could add a composition operator to make that syntax prettier:

<lang scala>class SweetFunction[B,C](f:B=>C) {

 def o[A](g:A=>B) = (x:A)=>f(g(x))

} implicit def sugarOnTop[A,B](f:A=>B) = new SweetFunction(f)

//and now you can do things like this println((cube o cube o cuberoot)(0.5))</lang>

Scheme

<lang scheme>(define (cube x) (expt x 3)) (define (cube-root x) (expt x (/ 1 3)))

(define function (list sin cos cube)) (define inverse (list asin acos cube-root))

(define (compose f g) (lambda (x) (f (g x))))

(define x 0.5) (define (go f g)

 (if (not (or (null? f)
              (null? g)))
     (begin (display ((compose (car f) (car g)) x))
            (newline)
            (go (cdr f) (cdr g)))))

(go function inverse)</lang> Output:

0.5
0.5
0.5

Slate

Compose is already defined in slate as (note the examples in the comment):

<lang slate>m@(Method traits) ** n@(Method traits) "Answers a new Method whose effect is that of calling the first method on the results of the second method applied to whatever arguments are passed. This composition is associative, i.e. (a ** b) ** c = a ** (b ** c). When the second method, n, does not take a *rest option or the first takes more than one input, then the output is chunked into groups for its consumption. E.g.:

  1. `er ** #; `er applyTo
    {'a'. 'b'. 'c'. 'd'} => 'abcd'
    `er ** #name `er applyTo
    {#a. #/}. => 'a/'"

[

 n acceptsAdditionalArguments \/ [m arity = 1]
   ifTrue:
     [[| *args | m applyTo: {n applyTo: args}]]
   ifFalse:
     [[| *args |
       m applyTo:
         ([| :stream |
            args do: [| *each | stream nextPut: (n applyTo: each)]
                 inGroupsOf: n arity] writingAs: {})]]

].

      • `er asMethod: #compose: on: {Method traits. Method traits}.</lang>

used as: <lang slate>n@(Number traits) cubed [n raisedTo: 3]. n@(Number traits) cubeRoot [n raisedTo: 1 / 3]. define: #forward -> {#cos `er. #sin `er. #cube `er}. define: #reverse -> {#arcCos `er. #arcSin `er. #cubeRoot `er}.

define: #composedMethods -> (forward with: reverse collect: #compose: `er). composedMethods do: [| :m | inform: (m applyWith: 0.5)].</lang>

Smalltalk

Works with: GNU Smalltalk

<lang smalltalk>|forward reverse composer compounds| "commodities" Number extend [

  cube [ ^self raisedTo: 3 ]

]. Number extend [

  cubeRoot [ ^self raisedTo: (1 / 3) ]

].

forward := #( #cos #sin #cube ). reverse := #( #arcCos #arcSin #cubeRoot ).

composer := [ :f :g | [ :x | f value: (g value: x) ] ].

"let us create composed funcs" compounds := OrderedCollection new.

1 to: 3 do: [ :i |

 compounds add: ([ :j | composer value: [ :x | x perform: (forward at: j) ]
                                 value: [ :x | x perform: (reverse at: j) ] ] value: i)

].

compounds do: [ :r | (r value: 0.5) displayNl ].</lang>

Output:

0.4999999999999999
0.5
0.5000000000000001

Standard ML

<lang sml>- fun cube x = Math.pow(x, 3.0); val cube = fn : real -> real - fun croot x = Math.pow(x, 1.0 / 3.0); val croot = fn : real -> real - fun compose (f, g) = fn x => f (g x); (* this is already implemented in Standard ML as the "o" operator = we could have written "fun compose (f, g) x = f (g x)" but we show this for clarity *) val compose = fn : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b - val funclist = [Math.sin, Math.cos, cube]; val funclist = [fn,fn,fn] : (real -> real) list - val funclisti = [Math.asin, Math.acos, croot]; val funclisti = [fn,fn,fn] : (real -> real) list - ListPair.map (fn (f, inversef) => (compose (inversef, f)) 0.5) (funclist, funclisti); val it = [0.5,0.5,0.500000000001] : real list</lang>

Tcl

The following is a transcript of an interactive session:

Works with: tclsh version 8.5

<lang Tcl>% namespace path tcl::mathfunc ;# to import functions like abs() etc. % proc cube x {expr {$x**3}} % proc croot x {expr {$x**(1/3.)}} % proc compose {f g} {list apply {{f g x} {{*}$f [{*}$g $x]}} $f $g}

% compose abs cube  ;# returns a partial command, without argument apply {{f g x} {{*}$f [{*}$g $x]}} abs cube

% {*}[compose abs cube] -3  ;# applies the partial command to argument -3 27

% set forward [compose [compose sin cos] cube] ;# omitting to print result % set backward [compose croot [compose acos asin]] % {*}$forward 0.5 0.8372297964617733 % {*}$backward [{*}$forward 0.5] 0.5000000000000017</lang> Obviously, the (C) library implementation of some of the trigonometric functions (on which Tcl depends for its implementation) on the platform used for testing is losing a little bit of accuracy somewhere.

TI-89 BASIC

See the comments at Function as an Argument#TI-89 BASIC for more information on first-class functions or the lack thereof in TI-89 BASIC. In particular, it is not possible to do proper function composition, because functions cannot be passed as values nor be closures.

Therefore, this example does everything but the composition.

(Note: The names of the inverse functions may not display as intended unless you have the “TI Uni” font.)

<lang ti89b>Prgm

 Local funs,invs,composed,x,i
 Define rc_cube(x) = x^3     © Cannot be local variables
 Define rc_curt(x) = x^(1/3)
 Define funs = {"sin","cos","rc_cube"}
 Define invs = {"sin","cos","rc_curt"}
 Define x = 0.5
 Disp "x = " & string(x)
 For i,1,3
   Disp "f=" & invs[i] & " g=" & funs[i] & " f(g(x))=" & string(#(invs[i])(#(funs[i])(x)))
 EndFor
 DelVar rc_cube,rc_curt  © Clean up our globals

EndPrgm</lang>

Ursala

Zip two lists of functions into a list of pairs of functions, make that a list of functions by composing each pair, "gang" the list of functions into a single function returning a list, and apply it to the argument 0.5. <lang Ursala>#import std

  1. import flo

functions = <sin,cos,times^/~& sqr> inverses = <asin,acos,math..cbrt>

  1. cast %eL

main = (gang (+)*p\functions inverses) 0.5</lang> output:

<5.000000e-01,5.000000e-01,5.000000e-01>