Я читал страницу GADTs для чайников на Haskell Wiki, и я до сих пор не понимаю, как и почему они должны использоваться. Автор привел мотивирующий пример:
data T a where
D1 :: Int -> T String
D2 :: T Bool
D3 :: (a,a) -> T [a]
Что именно делает этот код и почему он полезен?
Если этот вопрос слишком расплывчатый, возможно, связанный с ним вопрос: могут ли GADT использоваться для реализации функций-членов?