GADT's - Anwendungen und Nützlichkeit?

Ich beschreibe GADTs mit learnyouahaskell und interessiere mich für deren Einsatzmöglichkeiten. Ich verstehe, dass ihr Hauptmerkmal das explizite Setzen von Schriftarten ist.

Sowie

data Users a where 
  GetUserName :: Int -> Users String
  GetUserId :: String -> Users Int

usersFunction :: Users a -> a 
usersFunction (GetUserName id) 
   | id == 100      = "Bob"
   | id == 200      = "Phil"
   | otherwise      = "No corresponding user"
usersFunction (GetUserId name)
   | name == "Bob"      = 100
   | name == "Phil"     = 200
   | otherwise          = 0

main = do
   print $ usersFunction (GetUserName 100)

Was sind die anderen Verwendungsmöglichkeiten von GADTs, abgesehen von der zusätzlichen Typensicherheit beim Arbeiten mit diesen Datentypen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage