Higher-order functions

From Rosetta Code
Task
Higher-order functions
You are encouraged to solve this task according to the task description, using any language you may know.

Pass a function as an argument to another function.

ActionScript

<lang actionscript> package {

   public class MyClass {
       public function first(func:Function):String {
           return func.call();
       }
    
       public function second():String {
           return "second";
       }
       
       public static function main():void {
           var result:String = first(second);
           trace(result);
           result = first(function() { return "third"; });
           trace(result);
       }
   }

} </lang>

Ada

Simple Example

<lang ada>

with Ada.Text_Io; use Ada.Text_Io;

procedure Subprogram_As_Argument is
   type Proc_Access is access procedure;
   
   procedure Second is
   begin
      Put_Line("Second Procedure");
   end Second;
  
   procedure First(Proc : Proc_Access) is
   begin
      Proc.all;
   end First;
begin
   First(Second'Access);
end Subprogram_As_Argument;

</lang>

Complex Example

<lang ada>

with Ada.Text_Io; use Ada.Text_Io;

procedure Subprogram_As_Argument_2 is
   
   -- Definition of an access to long_float

   type Lf_Access is access Long_Float;
   
   -- Definition of a function returning Lf_Access taking an
   -- integer as a parameter

   function Func_To_Be_Passed(Item : Integer) return Lf_Access is
      Result : Lf_Access := new Long_Float;
   begin
      Result.All := 3.14159 * Long_Float(Item);
      return Result;
   end Func_To_Be_Passed;
   
   -- Definition of an access to function type matching the function
   -- signature above

   type Func_Access is access function(Item : Integer) return Lf_Access;
   
   -- Definition of an integer access type

   type Int_Access is access Integer;
   
   -- Define a function taking an instance of Func_Access as its
   -- parameter and returning an integer access type

   function Complex_Func(Item : Func_Access; Parm2 : Integer) return Int_Access is
      Result : Int_Access := new Integer;
   begin
      Result.All := Integer(Item(Parm2).all / 3.14149);
      return Result;
   end Complex_Func;
   
   -- Declare an access variable to hold the access to the function

   F_Ptr : Func_Access := Func_To_Be_Passed'access;
   
   -- Declare an access to integer variable to hold the result

   Int_Ptr : Int_Access;

begin

   -- Call the function using the access variable

   Int_Ptr := Complex_Func(F_Ptr, 3);
   Put_Line(Integer'Image(Int_Ptr.All));
end Subprogram_As_Argument_2;

</lang>

ALGOL 68

PROC first = (PROC(LONG REAL)LONG REAL f) LONG REAL:
(
  f(1) + 2
);

PROC second = (LONG REAL x)LONG REAL:
(
  x/2
);

main: (
  printf(($xg(5,2)l$,first(second)))
)

Output:

+2.50

C

Works with: gcc version 3.4.2 (mingw-special)


Simple example

The pointer to the function to be passed as an argument is the only involved pointer.

Definition of a function whose only parameter is a pointer to a function with no parameters and no return value:

 void myFuncSimple( void (*funcParameter)(void) )
 {
     /* ... */
    
     (*funcParameter)();  /* Call the passed function. */
     funcParameter();     /* Same as above with slight different syntax. */
 
     /* ... */
 }

Note that you can't call the passed function by " *funcParameter() ", since that would mean "call funcParameter and than apply the * operator on the returned value".

Call:

 void funcToBePassed(void);
 
 /* ... */
 
 myFuncSimple(&funcToBePassed);

Complex example

Definition of a function whose return value is a pointer to int and whose only parameter is a pointer to a function, whose (in turn) return value is a pointer to double and whose only parameter is a pointer to long.

 int* myFuncComplex( double* (*funcParameter)(long* parameter) )
 {
      long* inLong;
      double* outDouble;
 
      /* ... */
 
      outDouble = (*funcParameter)(inLong);  /* Call the passed function and store returned pointer. */
      outDouble = funcParameter(inLong);     /* Same as above with slight different syntax. */
 
      /* ... */
 }

Call:

 double* funcToBePassed(long* parameter);
 
 /* ... */
 
 int* outInt;  
 
 outInt = myFuncComplex(&funcToBePassed);

Pointer

Finally, declaration of a pointer variable of the proper type to hold such a function as myFunc:

 int* (*funcPointer)( double* (*funcParameter)(long* parameter) );
 
 /* ... */
 
 funcPointer = myFuncComplex;

Of course, in a real project you shouldn't write such a convoluted code, but use some typedef instead, in order to break complexity into steps.

C++

Function Pointer

Works with: g++ version 3.4.2 (mingw-special)

Same as C.

Template

Works with: Visual C++ version 2005

<lang cpp> #include <iostream>

 template<class Func>
 void first(Func func)
 {
   func();
 }
 
 void second()
 {
   std::cout << "second" << std::endl;
 }
 
 int main()
 {
   first(second);
   return 0;
 }</lang>

Template and Inheritance

Works with: Visual C++ version 2005

<lang cpp> #include <iostream>

 #include <functional>
 
 template<class Func>
 typename Func::result_type first(Func func, typename Func::argument_type arg)
 {
   return func(arg);
 }
 
 class second : public std::unary_function<int, int>
 {
 public:
   result_type operator()(argument_type arg)
   {
     return arg * arg;
   }
 };
 
 int main()
 {
   std::cout << first(second(), 2) << std::endl;
   return 0;
 }</lang>

Clean

Take a function as an argument and apply it to all elements in a list:

map f [x:xs] = [f x:map f xs]
map f []     = []

Pass a function as an argument:

incr x = x + 1

Start = map incr [1..10]

Do the same using a anonymous function:

Start = map (\x -> x + 1) [1..10]

Do the same using currying:

Start = map ((+) 1) [1..10]

Groovy

As closures:

first = { func -> func() }
second = { println "second" }

first(second)

As functions:

def first(func) { func() }
def second() { println "second" }

first(this.&second)

Common Lisp

In Common Lisp, functions are first class objects, so you can pass function objects as arguments to other functions:

CL-USER> (defun add (a b) (+ a b))
ADD
CL-USER> (add 1 2)
3
CL-USER> (defun call-it (fn x y)
            (funcall fn x y))
CALL-IT
CL-USER> (call-it #'add 1 2)
3

D

D's function/delegate will be investigated by passing each type of function/delegate to _test_ as argument. <lang d>module functest ; import std.stdio ;

// test the function argument string test(U)(string scopes, U func) {

 string typeStr = typeid(typeof(func)).toString ;
 string isFunc = (typeStr[$-1] == '*') ? "function" : "delegate" ;
 writefln("Hi, %-13s : scope: %-8s (%s) : %s", func(), scopes, isFunc, typeStr ) ; 
 return scopes ;

}

// normal module level function string aFunction(){ return "Function" ; }

// In-Function-Template-Instantiation(IFTI) Function T tmpFunc(T)() { return "IFTI.function" ; }

// Member in a template template tmpGroup(T) {

 T t0(){ return "Tmp.member.0" ; } 
 T t1(){ return "Tmp.member.1" ; } 
 T t2(){ return "Tmp.member.2" ; } 

}

// used for implementing member function at class & struct template Impl() {

 static string aStatic() { return "Static Method" ;  }
 string aMethod(){ return "Method" ; }

} class C { mixin Impl!() ; } struct S { mixin Impl!() ; }

void main() {

 // nested function
 string aNested(){
   return "Nested" ;
 } 
 // bind to a variable
 auto variableF = function string() { return "variable.F"; } ;
 auto variableD = delegate string() { return "variable.D"; } ;
 C c = new C ;
 S s ;
   "Global".test(&aFunction) ;
   "Nested".test(&aNested) ; 
    "Class".test(&C.aStatic) 
           .test(&c.aMethod) ; 
   "Struct".test(&S.aStatic) 
           .test(&s.aMethod) ; 
 "Template".test(&tmpFunc!(string))
           .test(&tmpGroup!(string).t2) ;
  "Binding".test(variableF)
           .test(variableD) ;  
 // leteral function/delegate
  "Literal".test(function string() { return "literal.F"; })
           .test(delegate string() { return "literal.D"; }) ;  

}</lang>

E

def map(f, list) {
  var out := []
  for x in list {
    out with= f(x)
  }
  return out
}
? map(fn x { x + x }, [1, "two"])
# value: [2, "twotwo"]
? map(1.add, [5, 10, 20])
# value: [6, 11, 21]

? def foo(x) { return -(x.size()) }
> map(foo, ["", "a", "bc"])
# value: [0, -1, -2]

Forth

Forth words can be referenced on the stack via their execution token or XT. An XT is obtained from a word via the quote operator, and invoked via EXECUTE. Anonymous functions may be defined via :NONAME (returning an XT) instead of a standard colon definition.

: square  dup * ;
: cube  dup dup * * ;
: map. ( xt addr len -- )
  0 do  2dup i cells + @ swap execute .  loop 2drop ;
create array 1 , 2 , 3 , 4 , 5 ,
' square array 5 map. cr   \ 1 4 9 16 25
' cube   array 5 map. cr   \ 1 8 27 64 125
:noname 2* 1+ ; array 5 map. cr   \ 3 5 7 9 11

Fortran

Works with: Fortran version 90 and later

use the EXTERNAL attribute to show the dummy argument is another function rather than a data object. i.e. <lang fortran> FUNCTION FUNC3(FUNC1, FUNC2, x, y)

  REAL, EXTERNAL :: FUNC1, FUNC2 
  REAL :: FUNC3
  REAL :: x, y

  FUNC3 = FUNC1(x) * FUNC2(y)
END FUNCTION FUNC3</lang>

Another way is to put the functions you want to pass in a module:

<lang fortran>module FuncContainer

 implicit none

contains

 function func1(x)
   real :: func1
   real, intent(in) :: x
   func1 = x**2.0
 end function func1
 function func2(x)
   real :: func2
   real, intent(in) :: x
   func2 = x**2.05
 end function func2

end module FuncContainer

program FuncArg

 use FuncContainer
 implicit none
 print *, "Func1"
 call asubroutine(func1)
 print *, "Func2"
 call asubroutine(func2)

contains

 subroutine asubroutine(f)
   ! the following interface is redundant: can be omitted
   interface
      function f(x)
        real, intent(in) :: x
        real :: f
      end function f
   end interface
   real :: px
   px = 0.0
   do while( px < 10.0 )
      print *, px, f(px)
      px = px + 1.0
   end do
 end subroutine asubroutine

end program FuncArg</lang>

Haskell

Works with: GHCi version 6.6

A function is just a value that wants arguments:

func1 f = f "a string"
func2 s = "func2 called with " ++ s

main = putStrLn $ func1 func2

Or, with an anonymous function:

func f = f 1 2 

main = print $ func (\x y -> x+y)
-- output: 3

Note that func (\x y -> x+y) is equivalent to func (+). (Operators are functions too.)

Icon

 procedure main()
   local lst
   lst := [10, 20, 30, 40]
   myfun(callback, lst)
end

procedure myfun(fun, lst)
   every fun(!lst)
end

procedure callback(arg)
   write("->", arg)
end

J

Adverbs take a single verb or noun argument and conjunctions take two. For example, / (insert) \ (prefix) and \. (suffix) are adverbs and ^: (power) is a conjunction. The following expressions illustrate their workings.

   + / 3 1 4 1 5 9   NB. sum
23
   >./ 3 1 4 1 5 9   NB. max
9
   *./ 3 1 4 1 5 9   NB. lcm
180

   +/\ 3 1 4 1 5 9   NB. sum prefix (partial sums)
3 4 8 9 14 23

   +/\. 3 1 4 1 5 9  NB. sum suffix
23 20 19 15 14 9

   f=: -:@(+ 2&%)    NB. one Newton iteration
   f 1
1.5
   f f 1
1.41667

   f^:(i.5) 1        NB. first 5 Newton iterations
1 1.5 1.41667 1.41422 1.41421
   f^:(i.5) 1x       NB. rational approximations to sqrt 2
1 3r2 17r12 577r408 665857r470832

Java

There is no real callback in Java like in C or C++, but we can do the same as swing does for executing an event. We need to create an interface that has the method we want to call or create one that will call the method we want to call. The following example uses the second way.

<lang java> public class NewClass {

   public NewClass() {
       first(new AnEventOrCallback() {
           public void call() {
               second();
           }
       });
   }
   
   public void first(AnEventOrCallback obj) {
       obj.call();
   }
   
   public void second() {
       System.out.println("Second");
   }
   
   public static void main(String[] args) {
       new NewClass();
   }
}

interface AnEventOrCallback {
   public void call();
}</lang>

JavaScript

<lang javascript>function first (func) {

 return func();

}

function second () {

 return "second";

}

var result = first(second); result = first(function () { return "third"; });</lang>

An example with anonymous functions and uses in the core library

<lang javascript>>>> var array = [2, 4, 5, 13, 18, 24, 34, 97]; >>> array [2, 4, 5, 13, 18, 24, 34, 97]

// return all elements less than 10 >>> array.filter(function (x) { return x < 10 }); [2, 4, 5]

// return all elements less than 30 >>> array.filter(function (x) { return x < 30 }); [2, 4, 5, 13, 18, 24]

// return all elements less than 100 >>> array.filter(function (x) { return x < 100 }); [2, 4, 5, 13, 18, 24, 34, 97]

// multiply each element by 2 and return the new array >>> array.map(function (x) { return x * 2 }); [4, 8, 10, 26, 36, 48, 68, 194]

// sort the array from smallest to largest >>> array.sort(function (a, b) { return a > b }); [2, 4, 5, 13, 18, 24, 34, 97]

// sort the array from largest to smallest >>> array.sort(function (a, b) { return a < b }); [97, 34, 24, 18, 13, 5, 4, 2]</lang>

You can pass the quoted symbol for the function and invoke it with RUN.

to printstuff
  print "stuff
end
to runstuff :proc
  run :proc
end
runstuff "printstuff    ; stuff
runstuff [print [also stuff]]  ; also stuff

MAXScript

fn second =
(
    print "Second"
)

fn first func =
(
    func()
)

first second

Metafont

We can simulate this by using scantokens, which digests a string as if it would be a source input.

<lang metafont>def calcit(expr v, s) = scantokens(s & decimal v) enddef;

t := calcit(100.4, "sind"); show t; end</lang>

OCaml

A function is just a value that wants arguments: <lang ocaml>

  1. let func1 f = f "a string";;

val func1 : (string -> 'a) -> 'a = <fun>

  1. let func2 s = "func2 called with " ^ s;;

val func2 : string -> string = <fun>

  1. print_endline (func1 func2);;

func2 called with a string - : unit = () </lang>

Or, with an anonymous function: <lang ocaml>

  1. let func f = f 1 2;;

val func : (int -> int -> 'a) -> 'a = <fun>

  1. Printf.printf "%d\n" (func (fun x y -> x + y));;

3 - : unit = () </lang> Note that func (fun x y -> x + y) is equivalent to func (+). (Operators are functions too.)

Octave

We can pass a function handle (@function_name)

<lang octave>function r = computeit(f, g, v)

 r = f(g(v));

endfunction

computeit(@exp, @sin, pi/3) computeit(@log, @cos, pi/6)</lang>

Or pass the string name of the function and use the feval primitive.

<lang octave>function r = computeit2(f, g, v)

 r = f(feval(g, v));

endfunction

computeit2(@exp, "sin", pi/3)</lang>

Pascal

Standard Pascal (will not work with Turbo Pascal): <lang pascal> program example(output);

function first(function f(x: real): real): real;
 begin
  first := f(1.0) + 2.0;
 end;

function second(x: real): real;
 begin
  second := x/2.0;
 end;

begin
 writeln(first(second));
end.</lang>

Turbo Pascal (will not work with Standard Pascal):

<lang pascal> program example;

type
 FnType = function(x: real): real;

function first(f: FnType): real;
 begin
  first := f(1.0) + 2.0;
 end;

function second(x: real): real;
 begin
  second := x/2.0;
 end;

begin
 writeln(first(second));
end.</lang>

Perl

<lang perl> sub another {

    # take a function and a value
    my $func = shift;
    my $val  = shift;

    # call the function with the value as argument
    return $func->($val);
};

sub reverser {
    return scalar reverse shift;
};

# pass named coderef
print another \&reverser, 'data';
# pass anonymous coderef
print another sub {return scalar reverse shift}, 'data';

# if all you have is a string and you want to act on that,
# set up a dispatch table
my %dispatch = (
    square => sub {return shift() ** 2},
    cube   => sub {return shift() ** 3},
    rev    => \&reverser,
);

print another $dispatch{$_}, 123 for qw(square cube rev);</lang>

PHP

<lang php> function first($func) {

  return $func();
}

function second() {
  return 'second';
}

$result = first('second');</lang>

Pop11

;;; Define a function
define x_times_three_minus_1(x);
  return(3*x-1);
enddefine;
;;; Pass it as argument to built-in function map and print the result
mapdata({0 1 2 3 4}, x_times_three_minus_1) =>


Python

Works with: Python version 2.5

<lang python> def first(function):

     return function()
 
 def second():
     return "second"
 
 result = first(second)</lang>

or

<lang python> result = first(lambda: "second")</lang>

Functions are first class objects in Python. They can be bound to names ("assigned" to "variables"), associated with keys in dictionaries, and passed around like any other object references. Classes are also first class objects and every class in Python is, implicitly, a "factory" for creating (instantiating) objects of that class. The use of class references support metaprogramming.

Ruby

With a proc (procedure): <lang ruby> succ = proc{|x| x+1}

 def to2(&f)
   f[2]
 end
 
 to2(&succ) #=> 3
 to2{|x| x+1} #=> 3</lang>
 

With a method: <lang ruby> def succ(n)

   n+1
 end
 def to2(m)
   m[2]
 end
 
 meth = method(:succ)
 to2(meth) #=> 3</lang>

Scala

def functionWithAFunctionArgument(x : int, y : int, f : (int, int) => int) = f(x,y)

Call:

functionWithAFunctionArgument(3, 5, {(x, y) => x + y}) // returns 8

Scheme

A function is just a value that wants arguments: <lang scheme> > (define (func1 f) (f "a string")) > (define (func2 s) (string-append "func2 called with " s)) > (begin (display (func1 func2)) (newline)) func2 called with a string </lang>

Or, with an anonymous function: <lang scheme> > (define (func f) (f 1 2)) > (begin (display (func (lambda (x y) (+ x y)))) (newline)) 3 </lang> Note that (func (lambda (x y) (+ x y))) is equivalent to (func +). (Operators are functions too.)

Standard ML

<lang sml> - fun func1 f = f "a string"; val func1 = fn : (string -> 'a) -> 'a - fun func2 s = "func2 called with " ^ s; val func2 = fn : string -> string

- print (func1 func2 ^ "\n"); func2 called with a string val it = () : unit </lang>

Or, with an anonymous function: <lang sml> - fun func f = f (1, 2); val func = fn : (int * int -> 'a) -> 'a

- print (Int.toString (func (fn (x, y) => x + y)) ^ "\n"); 3 val it = () : unit </lang> Note that func (fn (x, y) => x + y) is equivalent to func op+. (Operators are functions too.)

Tcl

<lang tcl> # this procedure executes its argument:

 proc demo {function} { 
   $function 
 }
 # for example:
 demo bell</lang>

Toka

Toka allows obtaining a function pointer via the ` (backtick) word. The pointers are passed on the stack, just like all other data.

 [ ." First\n" ] is first
 [ invoke ] is second
 ` first second

V

Define first as multiplying two numbers on stack

[first *].

Define second as applying the passed quote on stack

[second i].

Pass the first enclosed in quote to second which applies it on stack.

2 3 [first] second
=6