Higher-order functions: Difference between revisions

→‎{{header|Picat}}: Added subsections
(→‎{{header|Picat}}: Added subsections)
Line 3,395:
 
=={{header|Picat}}==
Here are some different approaches.
<lang Picat>go =>
The following variables and functions are assumed to be defined:
<lang Picat>go =>
% map...
L = 1..10,
L2 = 1..3,
% apply...
 
f1(X) = X**2.
% map
f2(X,A) = X**A + A**X.
 
% qsort(List, SortFunction)
% returns a sorted list according to the sort function SortFunction
qsort([],_F) = [].
qsort([H|T],F) = qsort([E : E in T, call(F,E,H)], F)
++ [H] ++
qsort([E : E in T, not call(F,E,H)],F).
 
% sort on length
sortf(F1,F2) =>
F1.length < F2.length.</lang>
 
===Using map===
<lang Picat> % ...
println(map(f1,L)),
println(map($f2(3),L)),
println(map(f2,L,map(f1,L))),.</lang>
 
% ===List comprehension. ===
In % This isgeneral the recommended approach.
<lang Picat> %
println([f1(I) : I in L]),
println([[I,J,f2(I,J)] : I in L, J in L2]),.</lang>
===Apply===
% apply
<lang Picat> % ...
println(apply(+,1,2)),
println(apply(f2,10,22)),.</lang>
 
% sort===Sort function===
Here is an example how to sort on length.
<lang Picat> % ...
S = [
"rosetta code",
Line 3,426 ⟶ 3,451:
],
println(map(len,S)),
println(S.qsort(sortf)), % sort on length.</lang>
 
nl.
 
f1(X) = X**2.
f2(X,A) = X**A + A**X.
 
% qsort(List, SortFunction)
% returns a sorted list according to the sort function SortFunction
qsort([],_F) = [].
qsort([H|T],F) = qsort([E : E in T, call(F,E,H)], F)
++ [H] ++
qsort([E : E in T, not call(F,E,H)],F).
 
% sort on length
sortf(F1,F2) =>
F1.length < F2.length.</lang>
 
{{out}}
Output:
<pre>[1,4,9,16,25,36,49,64,81,100]
[4,17,54,145,368,945,2530,7073,20412,60049]
495

edits