anchor.diff:  
   ---
   ### DDD und F#
  -#### Model für eine Email/Telefonenummer/Kundennummer etc.
  -
  -' Single Case union bedeutet, dass ich einen eignen Type für Emails reserviere.
  -' Funktionen/Datenstrukturen, die eine Email erfordern/zurückgeben, können dies jetzt mittels der Typdeklaration kundtun. 
  -' Emails sind halt keine strings.
  +#### Models for email, phone, customer number, etc.  
  +
  +' Use single case union to reserve a type for emails
  +' Functions and data structures that require email can now state this in a declarative manner
  +' It's possible to *hide* type constructors behind a module to insure compliance
  +' Emails are *NOT* strings!
   
   *)
   
   // single case union
   type Email = Email of string
  -type Telefon = PhoneNumber of string
  -type Kundennummer = CustomerNumber of string
  +
  +let emailConstructor s = 
  +    if System.Text.RegularExpressions.Regex.IsMatch(s,@"^\S+@\S+\.\S+$") 
  +        then Some (Email s)
  +        else None
  +
  +let v = emailConstructor "n@b.de"
  +let v' = emailConstructor "vvv"
  +
  +(** <div style="display: none" > *)
  +(*** define-output:SCU-Email ***)
  +printf "n@b.de = %A | vvv = %A" v v'
  +(** </div> *)
  +
  +(*** include-output:SCU-Email ***)
   
   (**
   
   --- 
   ### DDD und F#
  -#### Zustände
  -- Typ System hilft
  -    - Zusammenhängende Informationen zusammenfassen
  -    - Zustände darstellen
  +#### States
  +- Type system helps
  +    - bring realted data in structures
  +    - represent states
   
   *)
   
   module DDD0 = 
       open System
   
  -    type PersonenName = { Titel: string option; Vorname:string; Nachname:string; }
  -
  -    type Kontakt = { Name:PersonenName; Email:Email; EmailVerifiziert:bool; }
  +    type PersonalName = { Title: string option; Surname:string; Name:string; }
  +
  +    type Contact = { Name:PersonalName; Email:Email; EmailVerified:bool; }
   
   (**
   
  
positive.code: 
  *)
  
      type UnverifizierterKontakt = { Name: PersonenName; Email:Email; }
  
      type VerifizierterKontakt = { Name: PersonenName; Email:VerifizierteEmail; }
  
      type Kontakt' = 
          | UnverifizierterKontakt of UnverifizierterKontakt
          | VerifizierterKontakt of VerifizierterKontakt
  
      let ``Funktion gilt nur für verifizierte ohne Prüfung`` verifizierterKontakt = 
          verifizierterKontakt.Email.Email
  
  (**
  
  ---
  ### DDD und F#
  #### Model für einen Kunden mit Adressen
  
  
  ' Das Pattern matching schränkt die Auswahl auf konkrete Typen und nicht mehr auf das Abfragen von einzelnen Werten
  
negative.code: 
  (**
  
  ' An Enum representing states, mixed with a single type that contains a mixture of legal and illegal data
  
  ---
  ### DDD und F#
  #### More states
  
  *)
  
  