/* Higher-order functions (Rosetta code) in Picat. http://rosettacode.org/wiki/Higher-order_functions """ Pass a function as an argument to another function. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => go. go => L = 1..10, L2 = 1..3, % map println(map(f1,L)), println(map($f2(3),L)), println(map(f2,L,map(f1,L))), % List comprehension. % This is the recommended approach. println([f1(I) : I in L]), println([[I,J,f2(I,J)] : I in L, J in L2]), % apply println(apply(+,1,2)), println(apply(f2,10,22)), % sort function S = [ "rosetta code", "adam", "eve", "picat", "pattern-matching", "imperative", "constraints", "actors", "tabling" ], println(map(len,S)), println(S.qsort(sortf)), % sort on length nl. f1(X) = X**2. f2(X,A) = X**A + A**X. % % qsort(List, SortFunction) % returns a sorted list according to the sort function F % 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.