A függvény feladata az, hogy egy listába gyűjtse azokat a mátrixelemeket, amelyekre egy adott (a,b) koordinátájú mátrixelemről ráléphetek (a a sor-, b az oszlopindex). A kódot az órán bemutatott joszam10 (a,b) függvényhez hasonlóan próbáltam megírni.
Vázlatosan (a kipontozott helyeken a megértéshez nem szükséges értékdeklarációk és feltételvizsgálatok vannak):
Minta | Magyarázat |
---|---|
Mindenesjel (_) | Mindenre illeszkedik; a definíció jobb oldalán nem használható |
Állandó | Csak a meghatározott értékre illeszkedik |
Név (azoosító) | Mindenre illeszkedik |
Adatkonstruktor | Csak meghatározott szerkezetű, ill. tartalmú értékre illeszkedik |
Rekord | Csak adott szerkezetű rekordra illeszkedik |
Ennes (nullas is) | Csak adott szerkezetű ennesre illeszkedik |
Lista | Csak adott szerkezetű listára illeszkedik |
A konkrét kérdésre válaszolva: a szomszed1 függvénynek már az első
klózában olyan minta van, amely az összes lehetséges esetet lefedi, ezért
a többi klóz kiválaszására soha nem kerül sor. (Egyébként a val
alsosor = a+1 értékdeklarációnak nincs semmi hatása a mintára.)
A kérdező folytatja: Akkor hogyan lehet ezt a problémát megoldani?
Oktató: Mint láttuk, csak bizonyos kifejezések lehetnek minták az SML-ben, aritmetikai kifejezések és szinonimák nem. Ezért a szomszed1 függvényben - úgy, ahogyan a programrészletből vélhetően használni szeretné - sem alsosor, sem kozepa nem lehet minta, de nem lehet minta a fentiek szerint a+1 sem.
Egy aritmetikai kifejezés értéke csak a függvény törzsébe beírt kóddal vizsgálható meg, pl. az adott esetben az x aktualis értéke a szomszed1 függvény törzsében így: if x = alsosor then ...
A mintaillesztésnek erős korlátai vannak az SML-ben. Más funkcionális nyelvekben (pl. gofer, clean, haskell, Alice) a mintaillesztés sokkal rugalmasabb.
Amúgy ez nem hibaüzenet (error message), csak figyelmeztetés (warning), de erősen ajánljuk, hogy a figyelmeztetések okát is szüntesse meg a programjaiban, mert eltakarhatják az igazi hibákat.
Talán arra gondolt, hogy nem fordulhat elő olyan eset, amikor az iranyok és az egtajak közül az egyik üres, a másik meg nem. Ha ebben 100%-ig biztos, akkor a két sor megfordításával és apró módosításával ([] helyett a _ minta használatával mindkét esetben) a figyelmeztetés oka megszüntethető:
Néhány további tanács a programrészlethez:
Egy függvényben a paraméter(ek) összes lehetséges értékkombinaciójára kell egy-egy klózt írni, különben a Match (lefedetlen esetek) figyelmeztetést írja ki az értelmező. Csak figyelmeztetés, mert előfordulhat, hogy az adott környezetben az adott kombináció sohasem fordulhat elő, de biztosabb ilyenkor is az összes lehetséges esetre klózt írni.
Gondolja át, hogy milyen eset(ek)et nem fedett le, és legalább valami értelmes hibaüzenetet írjon ki az eddig lefedetlen esetekben, amelyből következtethet a hiba okára. Ha jobb ötlete nincs, írjon egy minden esetet lefedő klózt (... _ = ...), és írja ki a képernyőre az adatok szignifikáns részét. Ez persze csak otthon, teszteles közben segíthet. Ha kell, bővítse a tesztesetek körét.