Programowanie funkcyjne

Funkcje są obiektami pierwszej kategorii (można je podawać jako argumenty i zwracać jako wartość funkcji).

Przykłady

Map[f,{a,b,c}]

Inner[BesselJ,{a,b},{c,d},BesselK]

Konsekwencją tego, jest możliwość zdefiniowania n.p. operatora składania funkcji "∘" lub operatora różniczkowania (d/dx). Nie ma takiej możliwości n.p. w języku C.

Wartości funkcji zależą tylko od podanych argumentów (brak zmiennych globalnych, brak "pamięci" funkcji). Przykrą konsekwencją braku zmiennych globalnych jest n.p. brak możliwości przypisania definicji funkcji do symbolu.

Dla zainteresowanych programowaniem stricte funkcyjnym: Haskell.

Reprezentacja funkcji w Mathematice.

f1=Function[x,x^2]

Map[f1,{x,2,10}]

f1/@{x,2,10}

x=3

Clear[x]

Function[y,x y]

psss=Function[x,Function[y,x y]]

psss[x][y]

fold=Function[{f,g},Function[x,Evaluate[f[g[x]]]]]

fold[psss[x],psss[y]][2]

f2=Function[#^2];

f[2]

f3=#^2&

A1 = {0, 0}; A2 = {0, 1}; A3 = {1, 0};

list = ComposeList[RandomChoice[{
     Function[x, RotationMatrix[1/2].x/2 + A1],
     Function[x, RotationMatrix[-1/2].x/3 + A2],
     Function[x, 1/2 x + A3]},
    100000], {0., 0.}];

ListPlot[list]

init = IdentityMatrix[100][[50]];

ArrayPlot[NestList[step, init, 200]]

step = Function[init, If[MemberQ[{110, 100, 011, 001}, #], 1, 0] & /@ FromDigits /@ Partition[init, 3, 1, {2, 2}]]

ArrayPlot[Table[Mod[Binomial[i, j], 2], {i, 1, 100}, {j, 1, 100}]]

m = Array[RandomInteger[{0, 1}] &, {30, 30}];

next = Function[m, MapThread[If[2 <= # <= 3 && #2 == 1 || # == 3 && #2 == 0, 1, 0] &, {ListConvolve[{{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}, m, {2, 2}, 0], m}, 2]];

ListAnimate[ArrayPlot /@ NestList[next, m, 100]]