Auch heute geht es mit Rost und Kaffee weiter, allerdings mit grundsätzlicheren Datentypen. ttimeless wird von besonders winzigen Datentypen überrascht und Xyrill formuliert Gedanken darüber, warum Struktur das Handeln bestimmen sollte.
Länge: 48:57 Minuten
Rückbezug STP071: anhand von JSON haben wir die sichtbaren Datentypen besprochen
Einwurf Kombinatorik: Wieviele mögliche Werte haben die vorgenannten Typen (sofern nicht unendlich)? (wir schreiben K(T)
für die Kardinalität des Typs T
)
K(bool) = 2
(true
oder false
)K(T_N) = 2^N
Werte für Zahltypen mit N
Bits (z.B. 256 für i8
oder 65536 für u16
), weil jedes Bit zwei Werte hat, die unabhängig voneinander gewählt werden könnenK([T; N]) = K(T)^N
für K(T)
mögliche Werte des Elementtyps T
und Länge N
K(Vec<T>) = ∞
bis auf praktische PlatzbeschränkungenListen wirken sich auf die Kardinalität also wie eine Potenzierung aus
Produkttypen: Gesamttyp P
enthält je einen Wert von Typ T_1, T_2, ..., T_N
, somit K(P) = K(T_1) * K(T_2) * ... * K(T_N)
type Vector3D = (f64, f64, f64)
, oder als Strukturtypen (ungeordnete Menge von Werten, die mit Namen bezeichnet sind, z.B. struct Person { first_name: String, last_name: String }
)Summentypen: Gesamttyp S
enthält entweder einen Wert vom Typ T_1
oder T_2
oder ... oder T_N
, somit K(P) = K(T_1) + K(T_2) + ... + K(T_N)
enum ParseResult { Ok(DataStructure), Err(ParseError) }
{"Ok": ...}
)sehr kleine Spezialfälle: Gibt es Datentypen, die kleiner als bool
sind?
struct Empty {}
): nur ein möglicher Wert (1 ist das neutrale Element der Multiplikation)
null
serialisierenenum Option<T> { Some(T), None }
vor; None
ist hier im Prinzip eine Kurzschreibweise für None(Empty)
enum Impossible {}
): keine möglichen Werte (0 ist das neutrale Element der Addition)
quit()
)Abendgedanken: Warum das ganze Gerede über Datentypen?