Sildistatud ühend

Sildistatud ühend (inglise keeles "tagged union") ehk variant, summatüüp või kaaskorrutis, on informaatikas andmetüüp, mis sisaldab mitut erinevat fikseeritud tüüpi. Korraga saab ühendil olla ainult ühte tüüpi väärtus ja silt ütleb, milline tüüp on hetkel kasutuses. Silti võib lugeda omamoodi metaandmeteks. Sildistatud ühendit saab käsitleda kui tüüpi, millel on mitu erinevat "juhtu", millest peab kõiki korrektselt käsitlema siis, kui tüüp tuleb kasutusse. Sildistatud ühendid on vajalikud, et defineerida rekursiivseid andmetüüpe – näiteks selleks, et komponent mõnele tüübile "X" sisaldaks väärtust, mis on omakorda tüübist "X". Seda kasutatakse näiteks puude defineerimisel, kus on vajalik eristada harusid ja lehti.
Kirjeldus.
Sildistatud ühendid on tähtsal kohal funktsionaalsetes programmeerimiskeeltes nagu ML ja Haskell, kus neid nimetatakse "andmetüüpideks" (terminist "algebraline andmetüüp") ning kompilaator suudab tuvastada, et kõik ühendi juhud on käsitletud, mis aitab vältida igasuguseid vigu. Kompilatsiooniaegseid summatüüpe kasutatakse ka Rusti keeles, kus neid kutsutakse nimega "enum". Sildistatud ühendeid on võimalik konstrueerida ka paljudes keeltes, milles puudub nende otsene tugi. Näiteks on neid võimalik luua keeltes nagu C, kus on olemas sildistamata ühendid võtmesõnaga codice_1.
Sildistatud ühenditega keeltes käib sageli kaasas mõiste tüübikonstruktorist, millega on võimalik luua sildistatud ühendite tüüpe.
Sildistatud ühendi vaste matemaatikas on lõikumatu ühend ehk diskrimineeritud ühend, mis tavaliselt kirjutatakse formula_1-märgiga. Kui on antud sellisest ühendist "A + B" mõni element, on võimalik tuvastada, kas element tuli hulgast "A" või "B". Kui element asub mõlemas, eksisteerivad selle väärtustest kaks eraldiseisvat koopiat nii hulgas "A" kui ka hulgas "B".
Tüübiteoorias kutsutakse sildistatud ühendit "summatüübiks". Summatüüpidel on vastavussuhe korrutistüüpidega.
Näited.
Kui soovime luua kahendpuu täisarvudest, peaksime ML-i keeles looma sellise tüübi:
datatype puu = Leht
 | Tipp of (int * puu * puu)
See on sildistatud ühend tüübinimega codice_2 kahe juhuga: "Leht" (ingl. "leaf"), millega lõpeb üks puu teekondadest, ning "Tipp" (ingl. "node"), mis sisaldab täisarvu tüübiga codice_3 ning kahte väärtust omakorda tüübiga codice_2. Leht ja Tipp on väärtuste konstruktorid, mis lubavad meil luua näiteks sellise puu:
Tipp(5, Tipp(1, Leht, Leht), Tipp(3, Leht, Tipp(4, Leht, Leht)))
See kood vastab sellele puule:
Nüüd on võimalik mustrisobitust kasutades kirjutada tüübikindel (ja rekursiivne) funktsioon, mis näiteks loendab, mitu tippu on puul:
fun loendaTippusid(Leht) = 0
 | loendaTippusid(Tipp(int, vasak, parem)) =
 1 + loendaTippusid(vasak) + loendaTippusid(parem)
C.
C ei toeta otseselt sildistatud ühendite loomist, aga neid on võimalik luua sildistamata ühenditega codice_1, juhul kui silt on iga kord rangelt kontrollitud:
enum ShapeKind { Square, Rectangle, Circle };
struct Shape {
 int centerx;
 int centery;
 enum ShapeKind kind; /* Uniooni silt */
 union {
 struct { int side; }; /* Ruut */
 struct { int width, height; }; /* Ristkülik */
 struct { int radius; }; /* Ring */
};
int getSquareSide(struct Shape* s) {
 assert(s-&gt;kind == Square); /* programm seiskub, kui antud uniooni silt ei ole ruut */
 return s-&gt;side;
void setSquareSide(struct Shape* s, int side) {
 s-&gt;kind = Square;
 s-&gt;side = side;
/* ja nii edasi */
Programmi kiiruse mõttes on võimalik codice_6 funktsioonid pärast eemaldada, kui vigade vältimine on kindel. C++ keeles on C++17-st saati saadaval tüübikindel sildistatud ühend codice_7.
Rust.
Rusti keeles on sisseehitatud tugi sildistatud ühendite jaoks:
enum Tree {
 Leaf,
 Node(i64, Box&lt;Tree&gt;, Box&lt;Tree&gt;)
Rusti keeles on mustrisobituse jaoks saadaval võtmesõna codice_8, mis nõuab kõigi võimalike juhtude käsitlemist:
fn add_values(tree: Tree) -&gt; i64 {
 match tree {
 Tree::Node(v, a, b) =&gt; v + add_values(*a) + add_values(*b),
 Tree::Leaf =&gt; 0
Rusti vigade käsitluse süsteem on rajatud sellistele sildistatud ühenditele. Näiteks codice_9 tüüp valikuliste väärtuste esindamiseks, mis saab olla kas codice_10, kui väärtust ei ole, või codice_11, kui väärtus on olemas. See lubab keelel vältida nullviitade sattumist koodi.
Sarnane on codice_12, mis lisab ka tüübi codice_13 veaobjektide esindamiseks vea korral. See lubab Rustil vältida traditsioonilist eranditöötlust, kus erandid tõusevad koodis kuni nad tabavad eranditöötlejat või programm seiskub täielikult.