A Miranda programozási nyelv
Őregyenletek
Õregyenletek
Gyakran szükséges olyan függvényleírás, mely az értelmezési
tartomány egy objektumának aktuális értékétõl függ, vagy egy
olyan leírást akarunk, mely elkülönül az értelmezési tartomány egyes
részeitõl. Lehet használni e célra az elõre definiált
függvényeket (pl.: cond, fact), de sokkal kényelmesebb
az õrök vagy a minták használata az ilyen vizsgálatokra.
A
feltételes függvény definíciója, melynek három argumentuma a
feltétel, a then ág, és az else ág:
cond True x y = x
cond
False x y = y
És használhatjuk példaul egy ilyen esetben:
cond (x=0) 0 (1/x)
Az egyenletek több különbözõ
jobboldallal rendelkezhetnek, melyeket ún. õrök (guard-ok)
választanak el. Ezeket a jobboldalra egy vesszõ után írjuk.
Például egy közönséges LNKO (legnagyobb közös osztó) függvény
megvalósítás:
gcd a b = gcd (a-b) b, if a>b
=
gcd a (b-a), if b>a
=
a, if a=b
A szöveg szerinti elsõ olyan alternatíva
választódik ki, melynek igaz az értéke. Az utolsó alternatíva õre
lehet egy kulcsszó (otherwise), mely akkor kerül
kiválasztásra, ha valamennyi ág õrének értéke hamis. A
Miranda korábbi verzióival való kompatibilitás érdekében az
õrfeltételekben az if szócska használata opcionális
(elhagyható).
Néhány egyszerû példa, amiben nem írtuk ki az if kulcsszót:
abs:: num->num || abszolút
érték függvény
abs n = n, n>=0
=
-n, otherwise
fac:: num->num || faktoriálist
számító függvény fac n = 1, n=0 =
n * fac (n-1), n>0
Megengedett, hogy az õrök
segítségével akár parciális függvényeket is definiáljunk, de amikor
egy ilyen függvényt olyan aktuális paraméterekkel hívnak meg, melyek
az õrök egyikét sem elégítik ki, akkor az fatális
programhibához vezet. Például a Fibonacci függvény következõ
formában hibát fog adni, ha nem pozitív argumentummal hívjuk:
fib::
num->num
fib n = 1, (n=1) \/ (n=2)
=
fib (n-1) + fib (n-2), n>2
Természetesen a programozó
elkerülheti ezt a hibalehetõséget. Az egyik út, hogy a
függvény típusát olyan pontosan határozza meg, amennyire csak
lehetséges. Épp e célból a nyelv típusrendszere képes elfogadni új
típusokat és altípusokat. Ha a típus pontos definíciója nem
lehetséges, akkor a futási idõben jelentkezõ hiba
elkerülhetõ úgy, hogy totális függvényt definiálunk, vagyis
az õrök lefedik a függvény egész értelmezési tartományát.
Így
az elõzõ példa teljes függvénnyé való kiegészítése:
= error "a függvény
0-nál kisebb argumentummal nem hívható", otherwise