From 8c4b2632c46752d63987f861caccf8647cfbf5c2 Mon Sep 17 00:00:00 2001
From: mm0821
(define (promote p t) (cond [(person? p) (make-person (string-append t (person-name p)) (promote (person-father p) t) (promote (person-mother p) t))] [else p]))
Wir können formale Signaturen auch für rekursive Datentypen verwenden. Den äußeren Summentyp können wir über den Signaturkonstruktur mixed abbilden. Wichtig an der formalen Signatur FamilyTree ist, dass die -Definition selber rekursiv ist.
(define-struct person (name father mother)) (define FamilyTree (signature (mixed (enum #false) (PersonOf String FamilyTree FamilyTree))))
Diese Datentyp kann nun wie gewohnt in Signaturen verwendet werden, +Definition selber rekursiv ist.
(define-struct person (name father mother)) (define FamilyTree (signature (mixed False (PersonOf String FamilyTree FamilyTree))))
Dieser Datentyp kann nun wie gewohnt in Signaturen verwendet werden, beispielsweise:
(: Bob FamilyTree) (: person-has-ancestor (FamilyTree String -> Boolean)) (define (person-has-ancestor p a) ...)
Die FamilyTree Datendefinition von oben steht für eine Menge von Bäumen, in denen
jeder Knoten genau zwei ausgehende Kanten hat. Selbstverständlich können wir auch auf die
gleiche Weise Bäume repräsentieren, die drei oder fünf ausgehende Kanten haben —