Types voor procedure parameters

Vanuit het standpunt van de gebruiker is het prettig als het ingeven van parameters met een verkeerd type niet leidt tot onzinnige resultaten, maar resulteren in een foutmelding. Voor korte Maple sessies is dit niet van groot belang, maar bij een meer gesofisticeerd gebruik of bij programmeren van libraries is het essentieel.

> Macht1 := proc(x,n)
local Prod, i;
Prod := 1;
for i from 1 to n do
Prod := Prod*x;
od;
Prod
end:

> Macht1(2.5,3.1);

[Maple Math]

Dit resultaat is niet precies wat men zou verwachten:

> 2.5^3.1;

[Maple Math]

Dit eenvoudige voorbeeld toont aan dat het aangeven van het verwachte type voor parameters geen overbodige luxe is. De volgende versie van de procedure waarschuwt de gebruiker dat er andere dingen van de procedure verlangd worden dan voorzien door de programmeur (dikwijls een en dezelfde persoon).

> Macht2 := proc(x,n::posint)
local Prod, i;
Prod := 1;
for i from 1 to n do
Prod := Prod*x;
od;
Prod
end:

> Macht2(-2.3,2);

[Maple Math]

> Macht2(2.5,3.1);

Error, Macht2 expects its 2nd argument, n, to be of type posint, but received 3.1

Er zijn vrij veel datatypes in Maple, enkele van de meest gebruikte zijn

integer

nonneg: natuurlijk getal

posint: positief natuurlijk getal

realcons: constant reeel getal

name: naam van een Maple variabele

Ter illustratie van het 'name' type, het volgende voorbeeld:

> Gaussian1 := proc(Expr,X,A)
evalf(Int(Expr*exp(-X^2/2),X=-A..A)/sqrt(2*Pi))
end:

> Gaussian1(x^2,x,1.0);

[Maple Math]

> x := a + b;

[Maple Math]

> Gaussian1(x^2,x,1.0);

Error, (in evalf/int) invalid arguments

Deze foutmelding is tamelijk cryptisch, het specificeren van types voor de parameters verhelpt dit.

> Gaussian2 := proc(Expr::algebraic,X::name,A::realcons)
evalf(Int(Expr*exp(-X^2/2),X=-A..A)/sqrt(2*Pi))
end:

> Gaussian2(x^2,x,1.0);

Error, Gaussian2 expects its 2nd argument, X, to be of type name, but received a+b

> Gaussian2('x'^2,'x',1.0);

[Maple Math]

> Macht1 := 'Macht1': Macht2 := 'Macht2': x := 'x': Gaussian1 := 'Gaussian1': Gaussian2 := 'Gaussian2':