First-class functions/Use numbers analogously: Difference between revisions

Content added Content deleted
m (syntax highlighting fixup automation)
Line 26: Line 26:
{{trans|Python}}
{{trans|Python}}


<lang 11l>V (x, xi, y, yi) = (2.0, 0.5, 4.0, 0.25)
<syntaxhighlight lang="11l">V (x, xi, y, yi) = (2.0, 0.5, 4.0, 0.25)
V z = x + y
V z = x + y
V zi = 1.0 / (x + y)
V zi = 1.0 / (x + y)
Line 32: Line 32:
V numlist = [x, y, z]
V numlist = [x, y, z]
V numlisti = [xi, yi, zi]
V numlisti = [xi, yi, zi]
print(zip(numlist, numlisti).map((n, inversen) -> multiplier(inversen, n)(.5)))</lang>
print(zip(numlist, numlisti).map((n, inversen) -> multiplier(inversen, n)(.5)))</syntaxhighlight>


{{out}}
{{out}}
Line 40: Line 40:


=={{header|Ada}}==
=={{header|Ada}}==
<lang Ada>with Ada.Text_IO;
<syntaxhighlight lang="ada">with Ada.Text_IO;
procedure Firstclass is
procedure Firstclass is
generic
generic
Line 61: Line 61:
end;
end;
end loop;
end loop;
end Firstclass;</lang>
end Firstclass;</syntaxhighlight>
{{out}}
{{out}}
<pre>5.00000E-01
<pre>5.00000E-01
Line 73: Line 73:


Note: Standard ALGOL 68's scoping rules forbids exporting a '''proc'''[edure] (or '''format''') out of it's scope (closure). Hence this specimen will run on [[ELLA ALGOL 68]], but is non-standard. For a discussion of first-class functions in ALGOL 68 consult [http://www.cs.ru.nl/~kees/home/papers/psi96.pdf "The Making of Algol 68"] - [[wp:Cornelis_H.A._Koster|C.H.A. Koster]] (1993). <!-- Retrieved April 28, 2007 -->
Note: Standard ALGOL 68's scoping rules forbids exporting a '''proc'''[edure] (or '''format''') out of it's scope (closure). Hence this specimen will run on [[ELLA ALGOL 68]], but is non-standard. For a discussion of first-class functions in ALGOL 68 consult [http://www.cs.ru.nl/~kees/home/papers/psi96.pdf "The Making of Algol 68"] - [[wp:Cornelis_H.A._Koster|C.H.A. Koster]] (1993). <!-- Retrieved April 28, 2007 -->
<lang algol68>REAL
<syntaxhighlight lang="algol68">REAL
x := 2,
x := 2,
xi := 0.5,
xi := 0.5,
Line 94: Line 94:
inv n = inv num list[key];
inv n = inv num list[key];
print ((multiplier(inv n, n)(.5), new line))
print ((multiplier(inv n, n)(.5), new line))
OD</lang>
OD</syntaxhighlight>
Output:
Output:
<pre>
<pre>
Line 110: Line 110:


=={{header|Axiom}}==
=={{header|Axiom}}==
<lang Axiom>(x,xi,y,yi) := (2.0,0.5,4.0,0.25)
<syntaxhighlight lang="axiom">(x,xi,y,yi) := (2.0,0.5,4.0,0.25)
(z,zi) := (x+y,1/(x+y))
(z,zi) := (x+y,1/(x+y))
(numbers,invers) := ([x,y,z],[xi,yi,zi])
(numbers,invers) := ([x,y,z],[xi,yi,zi])
multiplier(a:Float,b:Float):(Float->Float) == (m +-> a*b*m)
multiplier(a:Float,b:Float):(Float->Float) == (m +-> a*b*m)
[multiplier(number,inver) 0.5 for number in numbers for inver in invers]
[multiplier(number,inver) 0.5 for number in numbers for inver in invers]
</lang>Output:
</syntaxhighlight>Output:
<lang Axiom> [0.5,0.5,0.5]
<syntaxhighlight lang="axiom"> [0.5,0.5,0.5]
Type: List(Float)</lang>
Type: List(Float)</syntaxhighlight>
We can also curry functions, possibly with function composition, with the same output as before:
We can also curry functions, possibly with function composition, with the same output as before:
<lang Axiom>mult(n:Float):(Float->Float) == curryLeft(*$Float,n)$MAPPKG3(Float,Float,Float)
<syntaxhighlight lang="axiom">mult(n:Float):(Float->Float) == curryLeft(*$Float,n)$MAPPKG3(Float,Float,Float)
[mult(number*inver) 0.5 for number in numbers for inver in invers]
[mult(number*inver) 0.5 for number in numbers for inver in invers]
[(mult(number)*mult(inver)) 0.5 for number in numbers for inver in invers]</lang>
[(mult(number)*mult(inver)) 0.5 for number in numbers for inver in invers]</syntaxhighlight>
Using the Spad code in [[First-class functions#Axiom]], this can be done more economically using:
Using the Spad code in [[First-class functions#Axiom]], this can be done more economically using:
<lang Axiom>(map(mult,numbers)*map(mult,invers)) 0.5</lang>
<syntaxhighlight lang="axiom">(map(mult,numbers)*map(mult,invers)) 0.5</syntaxhighlight>
For comparison, [[First-class functions#Axiom]] gave:
For comparison, [[First-class functions#Axiom]] gave:
<lang Axiom>fns := [sin$Float, cos$Float, (x:Float):Float +-> x^3]
<syntaxhighlight lang="axiom">fns := [sin$Float, cos$Float, (x:Float):Float +-> x^3]
inv := [asin$Float, acos$Float, (x:Float):Float +-> x^(1/3)]
inv := [asin$Float, acos$Float, (x:Float):Float +-> x^(1/3)]
[(f*g) 0.5 for f in fns for g in inv]
[(f*g) 0.5 for f in fns for g in inv]
</syntaxhighlight>
</lang>
- which has the same output.
- which has the same output.


=={{header|BBC BASIC}}==
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
{{works with|BBC BASIC for Windows}}
<lang bbcbasic> REM Create some numeric variables:
<syntaxhighlight lang="bbcbasic"> REM Create some numeric variables:
x = 2 : xi = 1/2
x = 2 : xi = 1/2
y = 4 : yi = 0.25
y = 4 : yi = 0.25
Line 160: Line 160:
DIM p% LEN(f$) + 4
DIM p% LEN(f$) + 4
$(p%+4) = f$ : !p% = p%+4
$(p%+4) = f$ : !p% = p%+4
= p%</lang>
= p%</syntaxhighlight>
'''Output:'''
'''Output:'''
<pre>
<pre>
Line 168: Line 168:
</pre>
</pre>
Compare with the implementation of First-class functions:
Compare with the implementation of First-class functions:
<lang bbcbasic> REM Create some functions and their inverses:
<syntaxhighlight lang="bbcbasic"> REM Create some functions and their inverses:
DEF FNsin(a) = SIN(a)
DEF FNsin(a) = SIN(a)
DEF FNasn(a) = ASN(a)
DEF FNasn(a) = ASN(a)
Line 201: Line 201:
DIM p% LEN(f$) + 4
DIM p% LEN(f$) + 4
$(p%+4) = f$ : !p% = p%+4
$(p%+4) = f$ : !p% = p%+4
= p%</lang>
= p%</syntaxhighlight>


=={{header|C sharp|C#}}==
=={{header|C sharp|C#}}==
{{works with|C#|4.0}}
{{works with|C#|4.0}}
The structure here is exactly the same as the C# entry in [[First-class functions]]. The "var" keyword allows us to use the same initialization code for an array of doubles as an array of functions. Note that variable names have been changed to correspond with the new functionality.
The structure here is exactly the same as the C# entry in [[First-class functions]]. The "var" keyword allows us to use the same initialization code for an array of doubles as an array of functions. Note that variable names have been changed to correspond with the new functionality.
<lang csharp>using System;
<syntaxhighlight lang="csharp">using System;
using System.Linq;
using System.Linq;


Line 233: Line 233:
}
}
}
}
</syntaxhighlight>
</lang>


=={{header|C++}}==
=={{header|C++}}==
<lang cpp>#include <array>
<syntaxhighlight lang="cpp">#include <array>
#include <iostream>
#include <iostream>


Line 263: Line 263:
}
}
}
}
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 272: Line 272:


=={{header|Clojure}}==
=={{header|Clojure}}==
<lang clojure>(def x 2.0)
<syntaxhighlight lang="clojure">(def x 2.0)
(def xi 0.5)
(def xi 0.5)
(def y 4.0)
(def y 4.0)
Line 287: Line 287:
> (for [[n i] (zipmap numbers invers)]
> (for [[n i] (zipmap numbers invers)]
((multiplier n i) 0.5))
((multiplier n i) 0.5))
(0.5 0.5 0.5)</lang>
(0.5 0.5 0.5)</syntaxhighlight>
For comparison:
For comparison:
<lang clojure>
<syntaxhighlight lang="clojure">
(use 'clojure.contrib.math)
(use 'clojure.contrib.math)
(let [fns [#(Math/sin %) #(Math/cos %) (fn [x] (* x x x))]
(let [fns [#(Math/sin %) #(Math/cos %) (fn [x] (* x x x))]
inv [#(Math/asin %) #(Math/acos %) #(expt % 1/3)]]
inv [#(Math/asin %) #(Math/acos %) #(expt % 1/3)]]
(map #(% 0.5) (map #(comp %1 %2) fns inv)))
(map #(% 0.5) (map #(comp %1 %2) fns inv)))
</syntaxhighlight>
</lang>
Output:
Output:
<pre>(0.5 0.4999999999999999 0.5000000000000001)</pre>
<pre>(0.5 0.4999999999999999 0.5000000000000001)</pre>
Line 300: Line 300:
=={{header|Common Lisp}}==
=={{header|Common Lisp}}==


<lang lisp>(defun multiplier (f g)
<syntaxhighlight lang="lisp">(defun multiplier (f g)
#'(lambda (x) (* f g x)))
#'(lambda (x) (* f g x)))


Line 319: Line 319:
inverse
inverse
value
value
(funcall multiplier value))))</lang>
(funcall multiplier value))))</syntaxhighlight>


Output:
Output:
Line 329: Line 329:
The code from [[First-class functions]], for comparison:
The code from [[First-class functions]], for comparison:


<lang lisp>(defun compose (f g) (lambda (x) (funcall f (funcall g x))))
<syntaxhighlight lang="lisp">(defun compose (f g) (lambda (x) (funcall f (funcall g x))))
(defun cube (x) (expt x 3))
(defun cube (x) (expt x 3))
(defun cube-root (x) (expt x (/ 3)))
(defun cube-root (x) (expt x (/ 3)))
Line 341: Line 341:
function
function
value
value
(funcall composed value)))</lang>
(funcall composed value)))</syntaxhighlight>


Output:
Output:
Line 350: Line 350:


=={{header|D}}==
=={{header|D}}==
<lang d>import std.stdio;
<syntaxhighlight lang="d">import std.stdio;


auto multiplier(double a, double b)
auto multiplier(double a, double b)
Line 374: Line 374:
writefln("%f * %f * %f == %f", f[i], r[i], 1.0, mult(1));
writefln("%f * %f * %f == %f", f[i], r[i], 1.0, mult(1));
}
}
}</lang>
}</syntaxhighlight>
Output:
Output:
<pre>2.000000 * 0.500000 * 1.000000 == 1.000000
<pre>2.000000 * 0.500000 * 1.000000 == 1.000000
Line 384: Line 384:
This is written to have identical structure to [[First-class functions#E]], though the variable names are different.
This is written to have identical structure to [[First-class functions#E]], though the variable names are different.


<lang e>def x := 2.0
<syntaxhighlight lang="e">def x := 2.0
def xi := 0.5
def xi := 0.5
def y := 4.0
def y := 4.0
Line 401: Line 401:
def b := reverse[i]
def b := reverse[i]
println(`s = $s, a = $a, b = $b, multiplier($a, $b)($s) = ${multiplier(a, b)(s)}`)
println(`s = $s, a = $a, b = $b, multiplier($a, $b)($s) = ${multiplier(a, b)(s)}`)
}</lang>
}</syntaxhighlight>


Output:
Output:
Line 414: Line 414:
{{trans|C#}}
{{trans|C#}}
ELENA 5.0 :
ELENA 5.0 :
<lang elena>import system'routines;
<syntaxhighlight lang="elena">import system'routines;
import extensions;
import extensions;
Line 432: Line 432:
multiplied.forEach:(multiplier){ console.printLine(multiplier(0.5r)) }
multiplied.forEach:(multiplier){ console.printLine(multiplier(0.5r)) }
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 441: Line 441:


=={{header|Erlang}}==
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
<lang Erlang>
-module( first_class_functions_use_numbers ).
-module( first_class_functions_use_numbers ).


Line 455: Line 455:


multiplier( N1, N2 ) -> fun(M) -> N1 * N2 * M end.
multiplier( N1, N2 ) -> fun(M) -> N1 * N2 * M end.
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 465: Line 465:


=={{header|F_Sharp|F#}}==
=={{header|F_Sharp|F#}}==
<lang fsharp>
<syntaxhighlight lang="fsharp">
let x = 2.0
let x = 2.0
let xi = 0.5
let xi = 0.5
Line 479: Line 479:
|> List.map ((|>) 0.5)
|> List.map ((|>) 0.5)
|> printfn "%A"
|> printfn "%A"
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 487: Line 487:
=={{header|Factor}}==
=={{header|Factor}}==
Compared to http://rosettacode.org/wiki/First-class_functions, the call to "compose" is replaced with the call to "mutliplier"
Compared to http://rosettacode.org/wiki/First-class_functions, the call to "compose" is replaced with the call to "mutliplier"
<lang factor>USING: arrays kernel literals math prettyprint sequences ;
<syntaxhighlight lang="factor">USING: arrays kernel literals math prettyprint sequences ;
IN: q
IN: q


Line 504: Line 504:
: example ( -- )
: example ( -- )
0.5 A B create-all
0.5 A B create-all
[ call( x -- y ) ] with map . ;</lang>
[ call( x -- y ) ] with map . ;</syntaxhighlight>
{{out}}
{{out}}
<pre>{ 0.5 0.5 0.5 }</pre>
<pre>{ 0.5 0.5 0.5 }</pre>
Line 510: Line 510:
=={{header|Fantom}}==
=={{header|Fantom}}==


<lang fantom>
<syntaxhighlight lang="fantom">
class Main
class Main
{
{
Line 531: Line 531:
}
}
}
}
</syntaxhighlight>
</lang>


The <code>combine</code> function is very similar to the <code>compose</code> function in 'First-class functions'. In both cases a new function is returned:
The <code>combine</code> function is very similar to the <code>compose</code> function in 'First-class functions'. In both cases a new function is returned:


<lang fantom>
<syntaxhighlight lang="fantom">
static |Obj -> Obj| compose (|Obj -> Obj| fn1, |Obj -> Obj| fn2)
static |Obj -> Obj| compose (|Obj -> Obj| fn1, |Obj -> Obj| fn2)
{
{
return |Obj x -> Obj| { fn2 (fn1 (x)) }
return |Obj x -> Obj| { fn2 (fn1 (x)) }
}
}
</syntaxhighlight>
</lang>


=={{header|Go}}==
=={{header|Go}}==
Line 556: Line 556:
At point C, numbers and their inverses have been multiplied and bound to first class functions. The ordered collection arrays could be modified at this point and the function objects would be unaffected.
At point C, numbers and their inverses have been multiplied and bound to first class functions. The ordered collection arrays could be modified at this point and the function objects would be unaffected.


<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 591: Line 591:
return n1n2 * m
return n1n2 * m
}
}
}</lang>
}</syntaxhighlight>
Output:
Output:
<pre>
<pre>
Line 614: Line 614:


[[/Go interface type|This can also be done with an interface type]] rather than the "empty interface" (<code>interface{}</code>) for better type safety and to avoid the <code>eval</code> function and type switch.
[[/Go interface type|This can also be done with an interface type]] rather than the "empty interface" (<code>interface{}</code>) for better type safety and to avoid the <code>eval</code> function and type switch.
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 661: Line 661:
panic("unsupported multiplier type")
panic("unsupported multiplier type")
return 0 // never reached
return 0 // never reached
}</lang>
}</syntaxhighlight>


=={{header|Groovy}}==
=={{header|Groovy}}==


<lang groovy>def multiplier = { n1, n2 -> { m -> n1 * n2 * m } }
<syntaxhighlight lang="groovy">def multiplier = { n1, n2 -> { m -> n1 * n2 * m } }


def ε = 0.00000001 // tolerance(epsilon): acceptable level of "wrongness" to account for rounding error
def ε = 0.00000001 // tolerance(epsilon): acceptable level of "wrongness" to account for rounding error
Line 675: Line 675:
}
}
println()
println()
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>2.000 * 0.500 * 1.000 == 1.000
<pre>2.000 * 0.500 * 1.000 == 1.000
Line 697: Line 697:
=={{header|Haskell}}==
=={{header|Haskell}}==


<lang haskell>module Main
<syntaxhighlight lang="haskell">module Main
where
where


Line 724: Line 724:
in printf "%f * %f * 0.5 = %f\n" number inverse (new_function 0.5)
in printf "%f * %f * 0.5 = %f\n" number inverse (new_function 0.5)
mapM_ print_pair pairs
mapM_ print_pair pairs
</syntaxhighlight>
</lang>


This is very close to the first-class functions example, but given as a full Haskell program rather than an interactive session.
This is very close to the first-class functions example, but given as a full Haskell program rather than an interactive session.
Line 735: Line 735:
[[First-class functions]] task solution. The solution here
[[First-class functions]] task solution. The solution here
is simpler and more direct since it handles a specific function definition.
is simpler and more direct since it handles a specific function definition.
<lang unicon>import Utils
<syntaxhighlight lang="unicon">import Utils


procedure main(A)
procedure main(A)
Line 744: Line 744:
procedure multiplier(n1,n2)
procedure multiplier(n1,n2)
return makeProc { repeat inVal := n1 * n2 * (inVal@&source)[1] }
return makeProc { repeat inVal := n1 * n2 * (inVal@&source)[1] }
end</lang>
end</syntaxhighlight>


A sample run:
A sample run:
Line 760: Line 760:
This seems to satisfy the new problem statement:
This seems to satisfy the new problem statement:


<lang j> x =: 2.0
<syntaxhighlight lang="j"> x =: 2.0
xi =: 0.5
xi =: 0.5
y =: 4.0
y =: 4.0
Line 770: Line 770:
rev =: xi,yi,zi
rev =: xi,yi,zi


multiplier =: 2 : 'm * n * ]'</lang>
multiplier =: 2 : 'm * n * ]'</syntaxhighlight>


An equivalent but perhaps prettier definition of multiplier would be:
An equivalent but perhaps prettier definition of multiplier would be:


<lang J>multiplier=: {{m*n*]}}</lang>
<syntaxhighlight lang="j">multiplier=: {{m*n*]}}</syntaxhighlight>


Or, if J's "right bracket is the right identity function" bothers you, you might prefer the slightly more verbose but still equivalent:
Or, if J's "right bracket is the right identity function" bothers you, you might prefer the slightly more verbose but still equivalent:


<lang J>multiplier=: {{m*n*{{y}}}}</lang>
<syntaxhighlight lang="j">multiplier=: {{m*n*{{y}}}}</syntaxhighlight>


Example use:
Example use:


<lang> fwd multiplier rev 0.5
<syntaxhighlight lang="text"> fwd multiplier rev 0.5
0.5 0.5 0.5</lang>
0.5 0.5 0.5</syntaxhighlight>


For contrast, here are the final results from [[First-class functions#J]]:
For contrast, here are the final results from [[First-class functions#J]]:
<lang> BA unqcol 0.5
<syntaxhighlight lang="text"> BA unqcol 0.5
0.5 0.5 0.5 0.5</lang>
0.5 0.5 0.5 0.5</syntaxhighlight>


===Tacit (unorthodox) version===
===Tacit (unorthodox) version===
Although the pseudo-code to generate the numbers can certainly be written (see above [http://rosettacode.org/wiki/First-class_functions/Use_numbers_analogously#Explicit_version Explicit version] ) this is not done for this version because it would destroy part of the analogy (J encourages, from the programming perspective, to process all components at once as opposed to one component at a time). In addition, this version is done in terms of boxed lists of numbers instead of plain list of numbers, again, to preserve the analogy.
Although the pseudo-code to generate the numbers can certainly be written (see above [http://rosettacode.org/wiki/First-class_functions/Use_numbers_analogously#Explicit_version Explicit version] ) this is not done for this version because it would destroy part of the analogy (J encourages, from the programming perspective, to process all components at once as opposed to one component at a time). In addition, this version is done in terms of boxed lists of numbers instead of plain list of numbers, again, to preserve the analogy.


<lang> multiplier=. train@:((;:'&*') ;~ an@: *)
<syntaxhighlight lang="text"> multiplier=. train@:((;:'&*') ;~ an@: *)
]A=. 2 ; 4 ; (2 + 4) NB. Corresponds to ]A=. box (1&o.)`(2&o.)`(^&3)
]A=. 2 ; 4 ; (2 + 4) NB. Corresponds to ]A=. box (1&o.)`(2&o.)`(^&3)
Line 807: Line 807:
└───┴───┴───┘
└───┴───┴───┘
BA of &> 0.5 NB. Corresponds to BA of &> 0.5 (exactly)
BA of &> 0.5 NB. Corresponds to BA of &> 0.5 (exactly)
0.5 0.5 0.5</lang>
0.5 0.5 0.5</syntaxhighlight>


Please refer to [http://rosettacode.org/wiki/First-class_functions#Tacit_.28unorthodox.29_version First-class functions tacit (unorthodox) version] for the definitions of the functions train, an and of.
Please refer to [http://rosettacode.org/wiki/First-class_functions#Tacit_.28unorthodox.29_version First-class functions tacit (unorthodox) version] for the definitions of the functions train, an and of.
Line 813: Line 813:
=={{header|jq}}==
=={{header|jq}}==
It may be helpful to compare the following definition of "multiplier" with its Ruby counterpart [[#Ruby|below]]. Whereas the Ruby definition must name all its positional parameters, the jq equivalent is defined as a filter that obtains them implicitly from its input.
It may be helpful to compare the following definition of "multiplier" with its Ruby counterpart [[#Ruby|below]]. Whereas the Ruby definition must name all its positional parameters, the jq equivalent is defined as a filter that obtains them implicitly from its input.
<lang jq># Infrastructure:
<syntaxhighlight lang="jq"># Infrastructure:
# zip this and that
# zip this and that
def zip(that):
def zip(that):
Line 833: Line 833:
def multiplier(j): .[0] * .[1] * j;
def multiplier(j): .[0] * .[1] * j;


numlist|zip(invlist) | map( multiplier(0.5) )</lang>
numlist|zip(invlist) | map( multiplier(0.5) )</syntaxhighlight>
{{out}}
{{out}}
$ jq -n -c -f First_class_functions_Use_numbers_analogously.jq
$ jq -n -c -f First_class_functions_Use_numbers_analogously.jq
Line 841: Line 841:


=={{header|JavaScript}}==
=={{header|JavaScript}}==
<lang javascript>const x = 2.0;
<syntaxhighlight lang="javascript">const x = 2.0;
const xi = 0.5;
const xi = 0.5;
const y = 4.0;
const y = 4.0;
Line 860: Line 860:
}
}


test().join('\n');</lang>
test().join('\n');</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 873: Line 873:
In Julia, like Python and R, functions can be treated as like as other Types.
In Julia, like Python and R, functions can be treated as like as other Types.


<lang julia>x, xi = 2.0, 0.5
<syntaxhighlight lang="julia">x, xi = 2.0, 0.5
y, yi = 4.0, 0.25
y, yi = 4.0, 0.25
z, zi = x + y, 1.0 / ( x + y )
z, zi = x + y, 1.0 / ( x + y )
Line 882: Line 882:
numlisti = [xi, yi, zi]
numlisti = [xi, yi, zi]


@show collect(multiplier(n, invn)(0.5) for (n, invn) in zip(numlist, numlisti))</lang>
@show collect(multiplier(n, invn)(0.5) for (n, invn) in zip(numlist, numlisti))</syntaxhighlight>


{{out}}
{{out}}
Line 888: Line 888:


=={{header|Kotlin}}==
=={{header|Kotlin}}==
<lang scala>// version 1.1.2
<syntaxhighlight lang="scala">// version 1.1.2


fun multiplier(n1: Double, n2: Double) = { m: Double -> n1 * n2 * m}
fun multiplier(n1: Double, n2: Double) = { m: Double -> n1 * n2 * m}
Line 905: Line 905:
println("${multiplier(a[i], ai[i])(m)} = multiplier(${a[i]}, ${ai[i]})($m)")
println("${multiplier(a[i], ai[i])(m)} = multiplier(${a[i]}, ${ai[i]})($m)")
}
}
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 915: Line 915:


=={{header|Lua}}==
=={{header|Lua}}==
<syntaxhighlight lang="lua">
<lang Lua>
-- This function returns another function that
-- This function returns another function that
-- keeps n1 and n2 in scope, ie. a closure.
-- keeps n1 and n2 in scope, ie. a closure.
Line 935: Line 935:
print(v .. " * " .. invs[k] .. " * 0.5 = " .. new_function(0.5))
print(v .. " * " .. invs[k] .. " * 0.5 = " .. new_function(0.5))
end
end
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 944: Line 944:


=={{header|M2000 Interpreter}}==
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Module CheckIt {
\\ by default numbers are double
\\ by default numbers are double
Line 978: Line 978:
}
}


</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 990: Line 990:
This code demonstrates the example using structure similar to function composition, however the composition function is replace with the multiplier function.
This code demonstrates the example using structure similar to function composition, however the composition function is replace with the multiplier function.


<lang Mathematica>multiplier[n1_,n2_]:=n1 n2 #&
<syntaxhighlight lang="mathematica">multiplier[n1_,n2_]:=n1 n2 #&
num={2,4,2+4};
num={2,4,2+4};
numi=1/num;
numi=1/num;
multiplierfuncs = multiplier @@@ Transpose[{num, numi}];
multiplierfuncs = multiplier @@@ Transpose[{num, numi}];
</syntaxhighlight>
</lang>


The resulting functions are unity multipliers:
The resulting functions are unity multipliers:
Line 1,002: Line 1,002:


Note that unlike Composition, the above definition of multiplier only allows for exactly two arguments. The definition can be changed to allow any nonzero number of arguments:
Note that unlike Composition, the above definition of multiplier only allows for exactly two arguments. The definition can be changed to allow any nonzero number of arguments:
<lang Mathematica>multiplier[arg__] := Times[arg, #] &
<syntaxhighlight lang="mathematica">multiplier[arg__] := Times[arg, #] &
</syntaxhighlight>
</lang>


=={{header|Nemerle}}==
=={{header|Nemerle}}==
{{trans|Python}}
{{trans|Python}}
<lang Nemerle>using System;
<syntaxhighlight lang="nemerle">using System;
using System.Console;
using System.Console;
using Nemerle.Collections.NCollectionsExtensions;
using Nemerle.Collections.NCollectionsExtensions;
Line 1,023: Line 1,023:
WriteLine($[multiplier(n, m) (0.5)|(n, m) in ZipLazy(nums, inums)]);
WriteLine($[multiplier(n, m) (0.5)|(n, m) in ZipLazy(nums, inums)]);
}
}
}</lang>
}</syntaxhighlight>


=={{header|Never}}==
=={{header|Never}}==
<syntaxhighlight lang="never">
<lang Never>
func multiplier(a : float, b : float) -> (float) -> float {
func multiplier(a : float, b : float) -> (float) -> float {
let func(m : float) -> float { a * b * m }
let func(m : float) -> float { a * b * m }
Line 1,051: Line 1,051:
0
0
}
}
</syntaxhighlight>
</lang>
{{output}}
{{output}}
<pre>
<pre>
Line 1,060: Line 1,060:


=={{header|Nim}}==
=={{header|Nim}}==
<syntaxhighlight lang="nim">
<lang Nim>
func multiplier(a, b: float): auto =
func multiplier(a, b: float): auto =
let ab = a * b
let ab = a * b
Line 1,080: Line 1,080:
let f = multiplier(list[i], invlist[i])
let f = multiplier(list[i], invlist[i])
# ... and apply it.
# ... and apply it.
echo f(0.5)</lang>
echo f(0.5)</syntaxhighlight>


{{out}}
{{out}}
Line 1,089: Line 1,089:
=={{header|Objeck}}==
=={{header|Objeck}}==
Similar however this code does not generate a list of functions.
Similar however this code does not generate a list of functions.
<lang objeck>use Collection.Generic;
<syntaxhighlight lang="objeck">use Collection.Generic;


class FirstClass {
class FirstClass {
Line 1,118: Line 1,118:
}
}
}
}
</syntaxhighlight>
</lang>


{{output}}
{{output}}
Line 1,129: Line 1,129:
=={{header|OCaml}}==
=={{header|OCaml}}==


<lang ocaml># let x = 2.0;;
<syntaxhighlight lang="ocaml"># let x = 2.0;;


# let y = 4.0;;
# let y = 4.0;;
Line 1,149: Line 1,149:
(* or just apply the generated function immediately... *)
(* or just apply the generated function immediately... *)
# List.map2 (fun n inv -> (multiplier n inv) 0.5) coll inv_coll;;
# List.map2 (fun n inv -> (multiplier n inv) 0.5) coll inv_coll;;
- : float list = [0.5; 0.5; 0.5]</lang>
- : float list = [0.5; 0.5; 0.5]</syntaxhighlight>


=={{header|Oforth}}==
=={{header|Oforth}}==


<lang Oforth>: multiplier(n1, n2) #[ n1 n2 * * ] ;
<syntaxhighlight lang="oforth">: multiplier(n1, n2) #[ n1 n2 * * ] ;


: firstClassNum
: firstClassNum
Line 1,163: Line 1,163:
x y + ->z
x y + ->z
x y + inv ->zi
x y + inv ->zi
[ x, y, z ] [ xi, yi, zi ] zipWith(#multiplier) map(#[ 0.5 swap perform ] ) . ;</lang>
[ x, y, z ] [ xi, yi, zi ] zipWith(#multiplier) map(#[ 0.5 swap perform ] ) . ;</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,170: Line 1,170:


=={{header|Oz}}==
=={{header|Oz}}==
<lang oz>declare
<syntaxhighlight lang="oz">declare


[X Y Z] = [2.0 4.0 Z=X+Y]
[X Y Z] = [2.0 4.0 Z=X+Y]
Line 1,188: Line 1,188:
do
do
{Show {{Multiplier N I} 0.5}}
{Show {{Multiplier N I} 0.5}}
end</lang>
end</syntaxhighlight>


"Multiplier" is like "Compose", but with multiplication instead of function application. Otherwise the code is identical except for the argument types (numbers instead of functions).
"Multiplier" is like "Compose", but with multiplication instead of function application. Otherwise the code is identical except for the argument types (numbers instead of functions).
Line 1,194: Line 1,194:
=={{header|PARI/GP}}==
=={{header|PARI/GP}}==
{{works with|PARI/GP|2.4.2 and above}}
{{works with|PARI/GP|2.4.2 and above}}
<lang parigp>multiplier(n1,n2)={
<syntaxhighlight lang="parigp">multiplier(n1,n2)={
x -> n1 * n2 * x
x -> n1 * n2 * x
};
};
Line 1,203: Line 1,203:
print(multiplier(y,yi)(0.5));
print(multiplier(y,yi)(0.5));
print(multiplier(z,zi)(0.5));
print(multiplier(z,zi)(0.5));
};</lang>
};</syntaxhighlight>
The two are very similar, though as requested the test numbers are in 6 variables instead of two vectors.
The two are very similar, though as requested the test numbers are in 6 variables instead of two vectors.


=={{header|Perl}}==
=={{header|Perl}}==
<lang perl>sub multiplier {
<syntaxhighlight lang="perl">sub multiplier {
my ( $n1, $n2 ) = @_;
my ( $n1, $n2 ) = @_;
sub {
sub {
Line 1,227: Line 1,227:
print multiplier( $number, $inverse )->(0.5), "\n";
print multiplier( $number, $inverse )->(0.5), "\n";
}
}
</syntaxhighlight>
</lang>
Output:
Output:
<pre>0.5
<pre>0.5
Line 1,234: Line 1,234:
</pre>
</pre>
The entry in first-class functions uses the same technique:
The entry in first-class functions uses the same technique:
<lang perl>sub compose {
<syntaxhighlight lang="perl">sub compose {
my ($f, $g) = @_;
my ($f, $g) = @_;
Line 1,243: Line 1,243:
...
...
compose($flist1[$_], $flist2[$_]) -> (0.5)
compose($flist1[$_], $flist2[$_]) -> (0.5)
</syntaxhighlight>
</lang>


=={{header|Phix}}==
=={{header|Phix}}==
Just as there is no real support for first class functions, not much that is pertinent to this task for numbers either, but the manual way is just as trivial:
Just as there is no real support for first class functions, not much that is pertinent to this task for numbers either, but the manual way is just as trivial:
<!--<lang Phix>(phixonline)-->
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">mtable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">mtable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
Line 1,271: Line 1,271:
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">yi</span><span style="color: #0000FF;">),</span><span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">yi</span><span style="color: #0000FF;">),</span><span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #000000;">zi</span><span style="color: #0000FF;">),</span><span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">multiplier</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #000000;">zi</span><span style="color: #0000FF;">),</span><span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span>
<!--</lang>-->
<!--</syntaxhighlight>-->
{{out}}
{{out}}
<pre>
<pre>
Line 1,281: Line 1,281:


Compared to first class functions, there are (as in my view there should be) significant differences in the treatment of numbers and functions, but as mentioned on that page tagging ctable entries should be quite sufficient.
Compared to first class functions, there are (as in my view there should be) significant differences in the treatment of numbers and functions, but as mentioned on that page tagging ctable entries should be quite sufficient.
<!--<lang Phix>(phixonline)-->
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ctable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ctable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
Line 1,308: Line 1,308:
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_composite</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 1</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_composite</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 1</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_composite</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 2.5</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">call_composite</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 2.5</span>
<!--</lang>-->
<!--</syntaxhighlight>-->


=={{header|PicoLisp}}==
=={{header|PicoLisp}}==
<lang PicoLisp>(load "@lib/math.l")
<syntaxhighlight lang="picolisp">(load "@lib/math.l")


(de multiplier (N1 N2)
(de multiplier (N1 N2)
Line 1,322: Line 1,322:
(prinl (format ((multiplier Inv Num) 0.5) *Scl)) )
(prinl (format ((multiplier Inv Num) 0.5) *Scl)) )
(list X Y Z)
(list X Y Z)
(list Xi Yi Zi) ) )</lang>
(list Xi Yi Zi) ) )</syntaxhighlight>
Output:
Output:
<pre>0.500000
<pre>0.500000
Line 1,330: Line 1,330:
that the function 'multiplier' above accepts two numbers, while 'compose'
that the function 'multiplier' above accepts two numbers, while 'compose'
below accepts two functions:
below accepts two functions:
<lang PicoLisp>(load "@lib/math.l")
<syntaxhighlight lang="picolisp">(load "@lib/math.l")


(de compose (F G)
(de compose (F G)
Line 1,346: Line 1,346:
(prinl (format ((compose Inv Fun) 0.5) *Scl)) )
(prinl (format ((compose Inv Fun) 0.5) *Scl)) )
'(sin cos cube)
'(sin cos cube)
'(asin acos cubeRoot) )</lang>
'(asin acos cubeRoot) )</syntaxhighlight>
With a similar output:
With a similar output:
<pre>0.500001
<pre>0.500001
Line 1,354: Line 1,354:
=={{header|Python}}==
=={{header|Python}}==
This new task:
This new task:
<lang python>IDLE 2.6.1
<syntaxhighlight lang="python">IDLE 2.6.1
>>> # Number literals
>>> # Number literals
>>> x,xi, y,yi = 2.0,0.5, 4.0,0.25
>>> x,xi, y,yi = 2.0,0.5, 4.0,0.25
Line 1,368: Line 1,368:
>>> [multiplier(inversen, n)(.5) for n, inversen in zip(numlist, numlisti)]
>>> [multiplier(inversen, n)(.5) for n, inversen in zip(numlist, numlisti)]
[0.5, 0.5, 0.5]
[0.5, 0.5, 0.5]
>>></lang>
>>></syntaxhighlight>


The Python solution to First-class functions for comparison:
The Python solution to First-class functions for comparison:
<lang python>>>> # Some built in functions and their inverses
<syntaxhighlight lang="python">>>> # Some built in functions and their inverses
>>> from math import sin, cos, acos, asin
>>> from math import sin, cos, acos, asin
>>> # Add a user defined function and its inverse
>>> # Add a user defined function and its inverse
Line 1,385: Line 1,385:
>>> [compose(inversef, f)(.5) for f, inversef in zip(funclist, funclisti)]
>>> [compose(inversef, f)(.5) for f, inversef in zip(funclist, funclisti)]
[0.5, 0.4999999999999999, 0.5]
[0.5, 0.4999999999999999, 0.5]
>>></lang>
>>></syntaxhighlight>
As can be see, the treatment of functions is very close to the treatment of numbers. there are no extra wrappers, or function pointer syntax added, for example.
As can be see, the treatment of functions is very close to the treatment of numbers. there are no extra wrappers, or function pointer syntax added, for example.


=={{header|R}}==
=={{header|R}}==
<lang R>multiplier <- function(n1,n2) { (function(m){n1*n2*m}) }
<syntaxhighlight lang="r">multiplier <- function(n1,n2) { (function(m){n1*n2*m}) }
x = 2.0
x = 2.0
xi = 0.5
xi = 0.5
Line 1,403: Line 1,403:
Output
Output
[1] 0.5 0.5 0.5
[1] 0.5 0.5 0.5
</syntaxhighlight>
</lang>


Compared to original first class functions
Compared to original first class functions
<lang R>sapply(mapply(compose,f1,f2),do.call,list(.5))
<syntaxhighlight lang="r">sapply(mapply(compose,f1,f2),do.call,list(.5))
[1] 0.5 0.5 0.5</lang>
[1] 0.5 0.5 0.5</syntaxhighlight>


=={{header|Racket}}==
=={{header|Racket}}==


<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
#lang racket


Line 1,429: Line 1,429:
((multiplier n i) 0.5))
((multiplier n i) 0.5))
;; -> '(0.5 0.5 0.5)
;; -> '(0.5 0.5 0.5)
</syntaxhighlight>
</lang>


=={{header|Raku}}==
=={{header|Raku}}==
(formerly Perl 6)
(formerly Perl 6)
{{works with|Rakudo|2015-09-10}}
{{works with|Rakudo|2015-09-10}}
<lang perl6>sub multiplied ($g, $f) { return { $g * $f * $^x } }
<syntaxhighlight lang="raku" line>sub multiplied ($g, $f) { return { $g * $f * $^x } }
my $x = 2.0;
my $x = 2.0;
Line 1,446: Line 1,446:
my @inverses = $xi, $yi, $zi;
my @inverses = $xi, $yi, $zi;
for flat @numbers Z @inverses { say multiplied($^g, $^f)(.5) }</lang>
for flat @numbers Z @inverses { say multiplied($^g, $^f)(.5) }</syntaxhighlight>
Output:
Output:
<pre>0.5
<pre>0.5
Line 1,456: Line 1,456:
The REXX language doesn't have an easy method to call functions by using a variable name,
The REXX language doesn't have an easy method to call functions by using a variable name,
<br>but the '''interpret''' instruction can be used to provide that capability.
<br>but the '''interpret''' instruction can be used to provide that capability.
<lang rexx>/*REXX program to use a first-class function to use numbers analogously. */
<syntaxhighlight lang="rexx">/*REXX program to use a first-class function to use numbers analogously. */
nums= 2.0 4.0 6.0 /*various numbers, can have fractions.*/
nums= 2.0 4.0 6.0 /*various numbers, can have fractions.*/
invs= 1/2.0 1/4.0 1/6.0 /*inverses of the above (real) numbers.*/
invs= 1/2.0 1/4.0 1/6.0 /*inverses of the above (real) numbers.*/
Line 1,468: Line 1,468:
@: return left( arg(1) / 1, 15) /*format the number, left justified. */
@: return left( arg(1) / 1, 15) /*format the number, left justified. */
multiplier: procedure expose n1n2; parse arg n1,n2; n1n2= n1 * n2; return 'a_new_func'
multiplier: procedure expose n1n2; parse arg n1,n2; n1n2= n1 * n2; return 'a_new_func'
a_new_func: return n1n2 * arg(1)</lang>
a_new_func: return n1n2 * arg(1)</syntaxhighlight>
{{out|output|text=&nbsp; when using the internal default inputs:}}
{{out|output|text=&nbsp; when using the internal default inputs:}}
<pre>
<pre>
Line 1,477: Line 1,477:


=={{header|Ruby}}==
=={{header|Ruby}}==
<lang ruby>multiplier = proc {|n1, n2| proc {|m| n1 * n2 * m}}
<syntaxhighlight lang="ruby">multiplier = proc {|n1, n2| proc {|m| n1 * n2 * m}}
numlist = [x=2, y=4, x+y]
numlist = [x=2, y=4, x+y]
invlist = [0.5, 0.25, 1.0/(x+y)]
invlist = [0.5, 0.25, 1.0/(x+y)]
p numlist.zip(invlist).map {|n, invn| multiplier[invn, n][0.5]}
p numlist.zip(invlist).map {|n, invn| multiplier[invn, n][0.5]}
# => [0.5, 0.5, 0.5]</lang>
# => [0.5, 0.5, 0.5]</syntaxhighlight>


This structure is identical to the treatment of Ruby's [[First-class functions#Ruby|first-class functions]] -- create a Proc object that returns a Proc object (a closure). These examples show that 0.5 times number ''n'' (or passed to function ''f'') times inverse of ''n'' (or passed to inverse of ''f'') returns the original number, 0.5.
This structure is identical to the treatment of Ruby's [[First-class functions#Ruby|first-class functions]] -- create a Proc object that returns a Proc object (a closure). These examples show that 0.5 times number ''n'' (or passed to function ''f'') times inverse of ''n'' (or passed to inverse of ''f'') returns the original number, 0.5.


=={{header|Rust}}==
=={{header|Rust}}==
<lang rust>#![feature(conservative_impl_trait)]
<syntaxhighlight lang="rust">#![feature(conservative_impl_trait)]
fn main() {
fn main() {
let (x, xi) = (2.0, 0.5);
let (x, xi) = (2.0, 0.5);
Line 1,506: Line 1,506:
move |m| x*y*m
move |m| x*y*m
}
}
</syntaxhighlight>
</lang>


This is very similar to the [[First-class functions#Rust|first-class functions]] implementation save that the type inference works a little bit better here (e.g. when declaring <code>numlist</code> and <code>invlist</code>) and <code>multiplier</code>'s declaration is substantially simpler than <code>compose</code>'s. Both of these boil down to the fact that closures and regular functions are actually different types in Rust so we have to be generic over them but here we are only dealing with 64-bit floats.
This is very similar to the [[First-class functions#Rust|first-class functions]] implementation save that the type inference works a little bit better here (e.g. when declaring <code>numlist</code> and <code>invlist</code>) and <code>multiplier</code>'s declaration is substantially simpler than <code>compose</code>'s. Both of these boil down to the fact that closures and regular functions are actually different types in Rust so we have to be generic over them but here we are only dealing with 64-bit floats.


=={{header|Scala}}==
=={{header|Scala}}==
<lang scala>scala> val x = 2.0
<syntaxhighlight lang="scala">scala> val x = 2.0
x: Double = 2.0
x: Double = 2.0


Line 1,544: Line 1,544:
0.5
0.5
0.5
0.5
0.5</lang>
0.5</syntaxhighlight>


=={{header|Scheme}}==
=={{header|Scheme}}==
This implementation closely follows the Scheme implementation of the [[First-class functions]] problem.
This implementation closely follows the Scheme implementation of the [[First-class functions]] problem.
<lang scheme>(define x 2.0)
<syntaxhighlight lang="scheme">(define x 2.0)
(define xi 0.5)
(define xi 0.5)
(define y 4.0)
(define y 4.0)
Line 1,566: Line 1,566:
(newline))
(newline))
n1 n2))
n1 n2))
(go number inverse)</lang>
(go number inverse)</syntaxhighlight>
Output:
Output:
0.5
0.5
Line 1,573: Line 1,573:


=={{header|Sidef}}==
=={{header|Sidef}}==
<lang ruby>func multiplier(n1, n2) {
<syntaxhighlight lang="ruby">func multiplier(n1, n2) {
func (n3) {
func (n3) {
n1 * n2 * n3
n1 * n2 * n3
Line 1,591: Line 1,591:
for f,g (numbers ~Z inverses) {
for f,g (numbers ~Z inverses) {
say multiplier(f, g)(0.5)
say multiplier(f, g)(0.5)
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,601: Line 1,601:
=={{header|Slate}}==
=={{header|Slate}}==
{{incorrect|Slate|Compare and contrast the resultant program with the corresponding entry in First-class functions.}}
{{incorrect|Slate|Compare and contrast the resultant program with the corresponding entry in First-class functions.}}
<lang slate>define: #multiplier -> [| :n1 :n2 | [| :m | n1 * n2 * m]].
<syntaxhighlight lang="slate">define: #multiplier -> [| :n1 :n2 | [| :m | n1 * n2 * m]].
define: #x -> 2.
define: #x -> 2.
define: #y -> 4.
define: #y -> 4.
Line 1,607: Line 1,607:
define: #numlisti -> (numlist collect: [| :x | 1.0 / x]).
define: #numlisti -> (numlist collect: [| :x | 1.0 / x]).


numlist with: numlisti collect: [| :n1 :n2 | (multiplier applyTo: {n1. n2}) applyWith: 0.5].</lang>
numlist with: numlisti collect: [| :n1 :n2 | (multiplier applyTo: {n1. n2}) applyWith: 0.5].</syntaxhighlight>


=={{header|Tcl}}==
=={{header|Tcl}}==
{{works with|Tcl|8.5}}
{{works with|Tcl|8.5}}
<lang tcl>package require Tcl 8.5
<syntaxhighlight lang="tcl">package require Tcl 8.5
proc multiplier {a b} {
proc multiplier {a b} {
list apply {{ab m} {expr {$ab*$m}}} [expr {$a*$b}]
list apply {{ab m} {expr {$ab*$m}}} [expr {$a*$b}]
}</lang>
}</syntaxhighlight>
Note that, as with Tcl's solution for [[First-class functions#Tcl|First-class functions]], the resulting term must be expanded on application. For example, study this interactive session:
Note that, as with Tcl's solution for [[First-class functions#Tcl|First-class functions]], the resulting term must be expanded on application. For example, study this interactive session:
<lang tcl>% set mult23 [multiplier 2 3]
<syntaxhighlight lang="tcl">% set mult23 [multiplier 2 3]
apply {{ab m} {expr {$ab*$m}}} 6
apply {{ab m} {expr {$ab*$m}}} 6
% {*}$mult23 5
% {*}$mult23 5
30</lang>
30</syntaxhighlight>
Formally, for the task:
Formally, for the task:
<lang tcl>set x 2.0
<syntaxhighlight lang="tcl">set x 2.0
set xi 0.5
set xi 0.5
set y 4.0
set y 4.0
Line 1,631: Line 1,631:
foreach a $numlist b $numlisti {
foreach a $numlist b $numlisti {
puts [format "%g * %g * 0.5 = %g" $a $b [{*}[multiplier $a $b] 0.5]]
puts [format "%g * %g * 0.5 = %g" $a $b [{*}[multiplier $a $b] 0.5]]
}</lang>
}</syntaxhighlight>
Which produces this output:
Which produces this output:
<pre>2 * 0.5 * 0.5 = 0.5
<pre>2 * 0.5 * 0.5 = 0.5
Line 1,642: Line 1,642:
composition operator (+), and is named in compliance
composition operator (+), and is named in compliance
with the task specification.
with the task specification.
<lang Ursala>#import std
<syntaxhighlight lang="ursala">#import std
#import flo
#import flo


Line 1,652: Line 1,652:
#cast %eL
#cast %eL


main = (gang multiplier*p\numbers inverses) 0.5</lang>
main = (gang multiplier*p\numbers inverses) 0.5</syntaxhighlight>
The multiplier could have been written in pattern
The multiplier could have been written in pattern
matching form like this.
matching form like this.
<lang Ursala>multiplier("a","b") "c" = times(times("a","b"),"c")</lang>
<syntaxhighlight lang="ursala">multiplier("a","b") "c" = times(times("a","b"),"c")</syntaxhighlight>
The main program might also have been written with an
The main program might also have been written with an
anonymous function like this.
anonymous function like this.
<lang Ursala>main = (gang (//times+ times)*p\numbers inverses) 0.5</lang>
<syntaxhighlight lang="ursala">main = (gang (//times+ times)*p\numbers inverses) 0.5</syntaxhighlight>
output:
output:
<pre>
<pre>
Line 1,666: Line 1,666:
=={{header|Wren}}==
=={{header|Wren}}==
{{libheader|Wren-fmt}}
{{libheader|Wren-fmt}}
<lang ecmascript>import "/fmt" for Fmt
<syntaxhighlight lang="ecmascript">import "/fmt" for Fmt


var multiplier = Fn.new { |n1, n2| Fn.new { |m| n1 * n2 * m } }
var multiplier = Fn.new { |n1, n2| Fn.new { |m| n1 * n2 * m } }
Line 1,686: Line 1,686:
var m = 0.5 // rather than 1 to compare with first-class functions task
var m = 0.5 // rather than 1 to compare with first-class functions task
Fmt.print("$0.1g * $g * $0.1g = $0.1g", x, y, m, multiplier.call(x, y).call(m))
Fmt.print("$0.1g * $g * $0.1g = $0.1g", x, y, m, multiplier.call(x, y).call(m))
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,697: Line 1,697:


=={{header|zkl}}==
=={{header|zkl}}==
<lang zkl>var x=2.0, y=4.0, z=(x+y), c=T(x,y,z).apply(fcn(n){ T(n,1.0/n) });
<syntaxhighlight lang="zkl">var x=2.0, y=4.0, z=(x+y), c=T(x,y,z).apply(fcn(n){ T(n,1.0/n) });
//-->L(L(2,0.5),L(4,0.25),L(6,0.166667))</lang>
//-->L(L(2,0.5),L(4,0.25),L(6,0.166667))</syntaxhighlight>
<lang zkl>fcn multiplier(n1,n2){ return('*.fp(n1,n2)) }</lang>
<syntaxhighlight lang="zkl">fcn multiplier(n1,n2){ return('*.fp(n1,n2)) }</syntaxhighlight>
This is actually partial evaluation, multiplier returns n1*n2*X where X isn't known yet. So multiplier(2,3)(4) --> (2*3*)4 --> 24. Even better, multiplier(2,3)(4,5) --> 120, multiplier(2,3)(4,5,6) --> 720, multiplier(2,3)() --> 6.
This is actually partial evaluation, multiplier returns n1*n2*X where X isn't known yet. So multiplier(2,3)(4) --> (2*3*)4 --> 24. Even better, multiplier(2,3)(4,5) --> 120, multiplier(2,3)(4,5,6) --> 720, multiplier(2,3)() --> 6.


Alternatively,
Alternatively,
<lang zkl>fcn multiplier(n1,n2){ fcn(n,X){ n*X }.fp(n1*n2) }</lang>
<syntaxhighlight lang="zkl">fcn multiplier(n1,n2){ fcn(n,X){ n*X }.fp(n1*n2) }</syntaxhighlight>
<lang zkl>var ms=c.apply(fcn([(n1,n2)]){ multiplier(n1,n2) });
<syntaxhighlight lang="zkl">var ms=c.apply(fcn([(n1,n2)]){ multiplier(n1,n2) });
//-->L(Deferred,Deferred,Deferred) // lazy eval of n*(1/n)*X
//-->L(Deferred,Deferred,Deferred) // lazy eval of n*(1/n)*X
ms.run(True,1.0) //-->L(1,1,1)
ms.run(True,1.0) //-->L(1,1,1)
ms.run(True,5.0) //-->L(5,5,5)
ms.run(True,5.0) //-->L(5,5,5)
ms.run(True,0.5) //-->L(0.5,0.5,0.5)</lang>
ms.run(True,0.5) //-->L(0.5,0.5,0.5)</syntaxhighlight>
List.run(True,X), for each item in the list, does i(X) and collects the results into another list. Sort of an inverted map or fold.
List.run(True,X), for each item in the list, does i(X) and collects the results into another list. Sort of an inverted map or fold.