Konstruktor (funkcionális programozás)

A típuselméletben és a funkcionális programozási nyelvekben az algebrai adattípus-konstruktor vagy egyszerűen egy konstruktor egy üres testtel rendelkező függvény, amely algebrai adattípusú objektumot hoz létre . Az optimalizáló fordítók ezeket a függvényeket statikusan hajtják végre, azaz fordítási időben .

Az algebrai adattípusok a Hindley-Milner típusú nyelvek fontos elemei .

Példa

Az XML -dokumentum legegyszerűbb szerkezete a Standard ML - ben a következőképpen határozható meg:

adattípus simple_xml = Üres | karakterlánc szava | _ A karakterlánc címkézése * simple_xml lista

Ez egy algebrai adattípus definíciója . Négy azonosítót vezet be a programba: egy nulláris típusú konstruktort és háromsimple_xml ilyen algebrai típusú objektumkonstruktort: ​​nullary , unary és binary . Ez utóbbi két paramétert vesz fel (jelen esetben sorként ), amelyek közül a másodiknak típusa van (vagyis az itt meghatározott típusú objektumok listája ). Így egy rekurzív adattípus . EmptyWordTaggedsimple_xml listsimple_xml

A konstruktorok minden függvényjoggal rendelkeznek (például a konstruktornak " " függvénytípusaWord van ), és különösen a függvényabsztrakcióban használhatók . string -> simple_xml

szórakoztató listOfWords s = térkép Word ( String . tokens Char . isSpace s ) fun toString e = let val scat = String . concat az Empty esetén = > " " | Szó s => s ^ " " | Tagged ( tag , contents ) => scat [ "<" , tag , ">" , scat ( térkép toString contents ), "</" , tag , ">" ] end

A függvény törzsében listOfWordsláthatja, hogy a konstruktor hogyan kerül Wordátadásra paraméterként a függvénynek map, és alkalmazza azt a karakterlánclista minden elemére, amelyet második paraméterként kap. A karakterláncok listáját pedig a függvény által listOfWordsbemeneti paraméterként kapott karakterlánc tokenizálásával (jelen esetben egyszerűen szavakra bontásával) kapjuk meg.

A konstruktor minden egyes Word"string" típusú objektumra történő alkalmazása egy típusú objektumot állít elő simple_xml. Ezek az utódobjektumok ezután egy lista felépítésére szolgálnak (ez a ben történik map) - így a függvény eredménye a listOfWordstípusú objektumok listája lesz simple_xml. Ezt megerősíti a függvény típusa , amelyre a fordító következtetstring -> simple_xml list : " ". Ennek megfelelően a függvény eredménye közvetlenül használható paraméterként egy másik ilyen típusú konstruktorhoz - Tagged - amely egy új típusú objektumot hoz létre simple_xml:

fun mkXmlFile s = Tagged ( "fő" , listOfWords s )

Így egy XML - dokumentumot rekurzívan összeállított algebrai típusú konstruktorok állítanak össze (innen ered a " rekurzív adattípus " elnevezés). Például egy ilyen dokumentumot

<main> Itt van néhány szöveg </main>

a programban a következő adatstruktúra fogja képviselni :

Tagged ( "fő" , [ Szó "Itt" , Word "is" , Word "some" , Word "text" ] )

Ebben a bejegyzésben kétféle konstruktor – simple_xmlés list. A [ , , ]listát létrehozó szintaxis valójában szintaktikai cukor típuskonstruktorok láncán keresztül list:

Tagged ( "fő" , Szó "Itt" :: Szó "van" :: Szó "néhány" :: Szó "szöveg" :: nulla )

Bár a típus minden XM-típusúlist nyelvbe be van építve , formálisan rekurzív adattípusként definiálva null konstruktorral és bináris konstruktorral , amelynek általában infix szimbolikus neve van (két kettőspont a klasszikus ML dialektusokban vagy egy a Haskellben) . nilcons

adattípus ' a lista = nil | :: of ' a * ' list infixr 5 :: _

Lásd még

Irodalom

  • Riccardo Pucella. Megjegyzések a New Jersey-i ML programozási szabványhoz (  ( angol ) ) // Utolsó felülvizsgálat: 2001. január 10. - Cornell Egyetem, 2001.