Fachkonzept: Gemischte Daten
Gemischte Daten als Zusammenfassung von ähnlichen Datentypen
(Beispielsweise verschiedene Tierarten unter dem Obertyp Tier.)
Gemischte Daten lassen sich analog zu Aufzählungen mit den Worten: ist eine(s)(r) der folgenden..." beschreiben.
;Ein zulässiger Datentypen der gemischten Daten ist einer der folgenden:
; - Datentyp-1
; - ...
; - Datentyp-n
Implementierung von gemischten Daten in Racket
Um in Racket gemischte Daten zu implementieren, benötigen wir drei Schlüsselwörter:
-
define
- Definiert den Namen der gemischten Datenmenge.
-
signature
- Legt fest, dass die nachfolgenden Datentypen innerhalb von Signaturen bei Nutzung der gemischten Daten verwendbar sind.
-
mixed
- Hinter
mixedfolgt eine Auflistung aller Datentypen, die unter den gemischten Daten zusammengefasst werden sollen.
- Hinter
;Ein zulässiger Datentypen der gemischten Daten ist einer der folgenden:
; - Datentyp-1
; - ...
; - Datentyp-n
(define name-gemischte-Datenmenge
(signature
(mixed Datentyp-1 ... Datentyp-n)))
Nutzung von gemischten Daten in Racket
Durch die Nutzung gemischter Daten kann z. B. eine einheitliche Funktion, über alle Datentypen hinweg, formuliert werden. Dafür ist es jedoch meist notwendig, innerhalb der Funktion den vorliegenden Datentyp zu prüfen, um bei Bedarf spezifische Funktionen wählen zu können.
Hierfür bietet Racket die Möglichkeit, Record-Definitionen mit Prädikaten auszustatten. Die auf das Vorliegen des zugeordneten Record-Typs testen:
(define-record nameDesRecordTyps
make-nameDesRecordTyps
namesDesRecordTyps?
(nameDesRecordTyps-feld-1 datentyp-1)
( ... )
(nameDesRecordTyps-feld-n datentyp-n))
Entsprechend der in den gemischten Daten vorliegenden Anzahl an unterschiedlichen Datentypen, ergeben sich für die Implementierung von Funktionen die notwendigen Fallunterscheidungen:
(define gemischte-Daten-Records (signature (mixed nameDesRecordTyps-1 ... nameDesRecordTyps-n))) (: funktion (gemischte-Daten-Records -> any)) (define funktion (lambda (x) (cond ([namesDesRecordTyps-1? x] ...) ... ([namesDesRecordTyps-n? x] ...))))