Algebraisk datatype

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 26. juli 2020; checks kræver 2 redigeringer .

En algebraisk datatype er den mest generelle sammensatte type inden for datalogi , som er en sumtype af produkttyper . En algebraisk type har et sæt konstruktører , som hver accepterer værdier af visse typer som input og returnerer værdien af ​​den konstruerede type. En konstruktør er en funktion , der konstruerer en værdi af sin type baseret på inputværdier. Mønstermatching bruges til at udtrække disse værdier fra den algebraiske type senere .

Et simpelt eksempel på en algebraisk datatype er en liste . Faktisk har en liste to konstruktører - en tom listekonstruktør og en parkonstruktør, hvis første element er en værdi af en bestemt type, og det andet er en liste. Et eksempel på en listedefinition i Haskell :

dataliste a = Nul | _ Ulemper a ( Liste a )

Så du kan se, at algebraiske datatyper er containertyper - de indeholder værdier af andre typer (eller af samme type) inde i dem. Det faktum, at listens første konstruktør ikke tager nogen parametre som input, bør ikke være vildledende. Denne form for konstruktøren er nødvendig for at skabe værdier, der ikke indeholder noget i sig selv, men er "enkelte" elementer af algebraiske datatyper.

Særlige varianter af algebraiske datatyper er kartesiske typer (de har kun én konstruktør) og opregninger (de har overhovedet ingen argumentkonstruktører, selvom der kan være flere konstruktører selv). Så den enkleste, men meget udbredte opregning er den boolske type. Haskell kode :

data bool = falsk | Rigtigt

En algebraisk datatype kan også være abstrakt , hvis en sådan type er defineret i et eller andet modul, hvorfra konstruktørerne af den tilsvarende type ikke eksporteres, og adgang til værdier inde i den algebraiske datatype udføres ved hjælp af specielle metoder - selectors . Særligt bemærkelsesværdigt er de såkaldte " generaliserede algebraiske datatyper ", som er implementeret i Haskell og ML .

Det er tilbage at bemærke, at fra syntaktisk orienteret datakonstruktion er en algebraisk datatype en markant forening af kartesiske produkter af typer. Hvert led i en diskrimineret forening svarer til én konstruktør, og hver konstruktør definerer igen det kartesiske produkt af de typer, der svarer til konstruktørens parametre. Konstruktører uden parametre er tomme produkter. Hvis den algebraiske datatype er rekursiv , pakkes hele den diskriminerede forening af den rekursive type, og hver konstruktør returnerer den rekursive type.

Implementering

Haskell sprog

I Haskell er enhver datatype, der ikke er primitiv , algebraisk. Alle mulige slags værdier ( optællinger , objekter , strukturer osv.) er bygget ved hjælp af algebraiske datatype-konstruktører. Derfor er emnet under overvejelse ekstremt vigtigt for at forstå Haskells skrivesystem.

Nemerle sprog

Nemerle - sproget har nøgleordet "variant", der kan bruges til at beskrive en algebraisk datatype. Alle varianter, der er oprettet på denne måde, kan mønstermatches ved hjælp af søgeordet "match".

Haxe sprog

I Haxe -sproget implementeres en algebraisk datatype ved hjælp af anonyme typer og opregninger . Sproget giver mønstertilpasning , som også kan bruges til at arbejde med en algebraisk datatype.

Se også

Links