ГАДТ - приложения и полезность?

Я рассказываю о GADT, используя learnyouahaskell, и меня интересует их возможное использование. Я понимаю, что их основной характеристикой является возможность явной установки типа.

Такие как:

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)

Помимо добавления дополнительной безопасности типов при работе с этими типами данных, каковы другие применения GADT?

Ответы на вопрос(1)

Ваш ответ на вопрос