ГАДТ - приложения и полезность?
Я рассказываю о 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?