Abstraktní Wikipedie/Pregenerický funkční model
- This page is historic and does not describe the current situation. See f:Wikifunctions:Function model for the current version of the function model.
Současný funkční model předepisuje funkční model Wikifunkcí pro dobu, kdy plánujeme wiki spustit. Především předpokládá, že máme již zcela kompletní projekt a umíme spouštět funkce, evaluaci funkcí, kompozici a generické typy. Ty však budou k dispozici až po Fázi ζ (zeta). To v současné době ztěžuje implementaci úloh v dřívějších fázích, protože musíme za běhu vymýšlet negenerické verze centrálních typů.
(Ve skutečnosti je to ještě horší: funkční model je ve skutečnosti jakýmsi podivným hybridem mezi modelem spouštěcích funkcí a předgenerickým modelem; Tímto přepisem chceme vyčistit obě části, počínaje definicí modelu předgenerické funkce.)
Abychom tuto překážku vyřešili, uvádíme zde zjednodušenou verzi modelu plné funkce, která má sloužit jako provizorní řešení do doby, než budou k dispozici generické modely.
Jeden celkový rozdíl spočívá v tom, že bez generik je potřeba místních klíčů značně omezená. Celý funkční model tedy předpokládá, že nemáme lokální klíče nebo že se jich můžeme zbavit při normalizaci. To nebude možné, až budeme mít generika.
"Bez rozdílu" v níže uvedeném seznamu znamená, že tento typ je stejný v předgenerickém modelu i v modelu s plnou funkcí.
Upozorňujeme, že kódy ZID nejsou konečné. Diskuse probíhá zde.
Z1/Object (Objekt) (Z4/Type) (Typ)
- Z1K1/type (Z4/Type)
Bez rozdílu.
Z2/Persistent object (Persistentní objekt) (Z4/Type) (Typ)
- Z2K1/id (Z6/String)
- Z2K2/value (Z1/Object)
- Z2K3/label (Z12/Multilingual text)
- Z2K4/aliases (Z32/Multilingual set)
- Z2K5/description (Z12/Multilingual text)
Bez rozdílu.
Z3/Key (Klíč) (Z4/Type) (Typ)
- Z3K1/value type (Z4/Type)
- Z3K2/key id (Z6/String)
- Z3K3/label (Z12/Multilingual text)
Bez rozdílu.
Z4/Type (Typ) (Z4/Type) (Typ)
- Z4K1/identity (Z4/Type)
- Z4K2/keys (Z10/List)
- Z4K3/validator (Z8/Function)
Z4K2 by měl očekávat Z10/List (Seznam) of Z3/Key (Klíč), ale to zatím není možné. Očekává tedy pouze Z10/List (Seznam).
Z4K3 by měl očekávat Z8/Function (Funkci), která přijme jeden vstup typu Z1/Object (Objekt) a vrátí Z10/List (Seznam) Z5/Error (Chyb), ale to zatím není možné, takže je to jen Z8/Function (Funkce).
Z5/Error (Chyba) (Z4/Type) (Typ)
- Z5K1/error type (Z50/Error type)
- Z5K2/error value (Z1/Any)
Možná bez rozdílu?
Z6/String (Řetězec) (Z4/Type) (Typ)
- Z6K1/string value (Z6/String)
Bez rozdílu.
Z7/Function call (Volání funkce) (Z4/Type) (Typ)
- Z7K1/function (Z8/Function)
- Others based on Z8/Function
To se podstatně změní. V předgenerické verzi se jedná o Z4/Type (Typ), jehož instance se chovají úplně jinak než instance jiných typů: klíče nejsou definovány Z4/Type (Typ), ale Z8/Function (Funkce). V předgenerickém světě to bude vyžadovat zvláštní zacházení. Pro postgenerický svět doufáme v jednotnou úpravu. Viz diskuze zde.
Z8/Function (Funkce) (Z4/Type) (Typ)
- Z8K1/arguments (Z10/List)
- Z8K2/return type (Z4/Type)
- Z8K3/testers (Z10/List)
- Z8K4/implementations (Z10/List)
- Z8K5/identity (Z8/Function)
To se podstatně změní. V předgenerické verzi je to Z4/Type (Typ) a později se z něj stane Z8/Function (Funkce), který má v podstatě dané klíče. Z8K1/arguments (parametry) by měly být deklarací Z10/List (Seznam) Z17/Argument (Parametr) (TBD). Z8K3 a Z8K4 by měly být Z10/List (Seznam) Z20/Tester (Testerů), respektive Z14/Implementation (Implementace) s danou Z8/Function (Funkcí) jako parametrem. Musí být plně specifikováno.
Z9/Reference (Reference) (Z4/Type) (Typ)
- Z9K1/reference ID (Z6/String)
Bez rozdílu.
Z10/List (Seznam) (Z4/Type) (Typ)
- Z10K1/head (Z1/Object)
- Z10K2/tail (Z10/List)
Jedná se o klasický generický Z4/Type (Typ). V předgenerické verzi bere jako hodnotu libovolný Z1/Object (Objekt) a jako pokračování má Z10/List (Seznam). V postgenerickém světě to bude Z8/Function (Funkce) s jediným argumentem typu Z4/Type (Typ), která vrátí Z4/Type (Typ) (parametrizovaný seznam), jehož typem hlavičky bude daný Z4/Type (Typ) a jehož typem patičky bude Z10/List (Seznam) parametrizovaný stejným typem.
Z11/Monolingual text (Jednojazyčný text) (Z4/Type) (Typ)
- Z11K1/language (Z60/Language)
- Z11K2/text (Z6/String)
Bez rozdílu.
Z12/Multilingual text (Vícejazyčný text) (Z4/Type) (Typ)
- Z12K1/texts (Z10/List)
Typ Z12K1 by se měl stát Z10/List (Seznam) Z11/Monolingual texts (Jednojazyčných textů).
Z14/Implementation (Implementace) (Z4/Type) (Typ)
- Z14K1/function (Z8/Function)
- Z14K2/composition (Z1/Any)
- Z14K3/code (Z16/Code)
- Z14K4/built in (Z6/String)
Jako parametr by měla být použita funkce. Je třeba to znovu promyslet.
Z16/Code (Kód) (Z4/Type) (Typ)
- Z16K1/language (Z61/Programming language)
- Z16K2/code (Z6/String)
Z16K3/signature (Z10/List)
Signaturou bude Z10/List (Seznam) Z4/Types (Typy). Bude to potřeba pouze v obecném modelu: jediný důvod, proč mít signaturu oddělenou od signatury v definici, je ten, že bychom nemuseli vyhodnocovat hodnoty před provedením funkce.
Z17/Argument declaration (deklarace parametru)
- Z17K1/argument type (Z4/Type)
- Z17K2/key id (Z6/String)
- Z17K3/label (Z12/Multilingual text)
Bez rozdílu. Ale musí vůbec existovat, nebo to může být jen Z3/Key (Klíč)?
Z18/Argument reference (Reference parametru) (Z4/Type) (Typ)
- Z18K1/key id (Z6/String)
Bez rozdílu.
Z20/Tester (Tester) (Z4/Type) (Typ)
- Z20K1/function (Z8/Function)
- Z20K2/call (Z7/Function call)
- Z20K3/result validation (Z7/Function call)
Z21/Unit (Jednotka) (Z4/Type) (Typ)
- (Bez klíčů)
Bez rozdílu.
Z22/Pair (Pár) (Z4/Type) (Typ)
- Z22K1/first (Z1/Object)
- Z22K2/second (Z1/Object)
I ten bude generický.
Z23/Nothing (Nic) (Z4/Type) (Typ)
- (Bez klíčů)
Bez rozdílu.
Z31/MonoLingualStringSet (Množina jednojazyčných řetězců) (Z4/Type) (Typ)
- Z31K1/language (jazyk) (Z60/Language) (Jazyk)
- Z31K2/stringset (množina řetězců) (Z10/List) (Seznam)
Z31K2/stringset (množina řetězců) bude Z10/List (Seznam) Z6/Strings (Řetězců).
Z32/MultiLingualStringSet (Množina vícejazyčných řetězců) (Z4/Type) (Typ)
- Z21K1/stringsets (množina řetězců) (Z10/List) (Seznam)
Z32K1/stringsets (množiny řetězců) budou Z10/List (Seznamem) Z31/MonoLingualStringSets (Množin jednojazyčných řetězců).
Z39/Key reference (Reference klíčů) (Z4/Type) (Typ)
- Z39K1/reference (reference) (Z6/String) (Řetězec)
Bez rozdílu.
Z40/Boolean (Boolean) (Z4/Type) (Typ)
- Z40K1/identity (Z40/Boolean)
Bez rozdílu.
Z50/Error type (Typ chyby) (Z4/Type) (Typ)
- Z50K1/keys (Z10/List)
- Z50K2/...: Něco, co z toho udělá řetězec zadaný klíči. To bude přidáno později.
To se změní. Z50K1 bude Z10/List (Seznam) Z3/Keys (Klíčů), a co je důležitější, stane se z něj funkce, která vytvoří Z4/Type (Typ).
Z60/Language (Jazyk) (Z4/Type) (Typ)
- Z60K1/code (Z6/String)
- Z60K2/code aliases (Z10/List)
Bez rozdílu.
Z61/Programming language (Programovací jazyk) (Z4/Type) (Typ)
- Z61K1/code (Z6/String)
Bez rozdílu.
Z70/Union (Sjednocení) (Z4/Type) (Typ)
V předgenerickém modelu neexistuje.
Z80/Byte (Byte) (Z4/Type) (Typ)
- Z80K1/value (Z6/String)
Bez rozdílu.
Z86/Code point (Ukazatel na kód) (Z4/Type) (Typ)
- Z86K1/value (Z6/String)
Bez rozdílu.
Z99/Quote (Citace) (Z4/Type) (Typ)
- Z99K1/quotation (Z1/Object)
Bez rozdílu.
Viz též
- Funkční model (dle plánu)
- Přehled poznámek