Oktató: Nem világos, mit nevez struktúrának. Találgatok:
- rekord (record; ezt nevezik a C-ben struktúrának),
- ennes (tuple; ez az SML-rekord speciális esete),
- struktúra (structure; ez modulfogalom, implementációs modult jelent).
Gondolom, nem az utóbbiról van szó, arról ugyanis a tárgyban keveset
tanulunk, és a zárthelyin, a vizsgán, a feladatokban sem igazán kell
használni (paraméterként biztosan nem).
Akkor nézzük az első két esetet. Egy függvényben a paramétereket a
legkényelmesebb mintaillesztéssel elérhetővé tenni. Ha a paraméter
összetett, akkor használhatunk
- összetett mintát (általában ez az ajánlott, olvashatóbb megoldás),
- (kiválasztó) függvényt.
Példák összetett mintára:
- rekordminta
fun // {den = 0, ...} = raise Domain
| // {num = n, den = d} = (real n) / (real d);
vagy
fun // {den = 0, ...} = raise Domain
| // {num, den} = (real num) / (real den);
- ennesminta
fun iterlen ([], n) = n
| iterlen (_::xs, n) = iterlen(xs, n+1);
Példák kiválasztófüggvény alkalmazására:
- ha rekord a paraméter:
type rat = {num : int, den : int};
fun // (r : rat) = if #den r = 0
then raise Domain
else real(#num r)/real(#den r);
- ha ennes a paraméter:
fun iterlen p = if null(#1 p)
then #2 p
else iterlen(tl(#1 p), #2 p + 1);
A kérdező folytatja: Konkrétan az is érdekel, hogy ha a struktúrának valamelyik eleme
lista, az ilyen elemet hogyan lehet elérni. Ugyanúgy, mint általában, vagy
másképp? Tud estetleg mutatni valaki ezekre egy-egy rövid
programrészletet?
Oktató: Ugyanúgy, lásd a fenti példákat: mind az x::xs jellegű minta,
mind a hd, tl, null stb. függvények használhatók.
Általában javasolom a mintaillesztést. Természetesen lista lehet ennes,
rekord vagy más lista eleme is.