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