Ответ 1
(Здесь я только догадываюсь, но хочу поделиться этой мыслью.)
Предположим, что мы можем написать
data family CDF a where
CDF Int = CDFInt String
CDF Bool = CDFBool Char
CDF a = CDFOther Double
Теперь, каков тип конструкторов значений, вызванных этим определением? У меня возникло бы желание сказать:
CDFInt :: String -> CDF Int
CDFBool :: Char -> CDF Bool
CDFOther :: Double -> CDF a
... но последнее кажется очень неправильным, так как мы получили бы
CDFOther @ Int :: Double -> CDF Int
который должен быть запрещен, поскольку в замкнутом семействе данных можно было бы ожидать, что (не нижнее) значение CDF Int
должно начинаться с конструктора CDFInt
.
Возможно, подходящий тип
CDFOther :: (a /~ Int, a /~ Bool) => Double -> CDF a
включая "ограничения неравенства", но для этого потребуется больше машинного оборудования для ввода текста, которое в настоящее время доступно в GHC. Я понятия не имею, было ли проверка типа/вывода оставалась разрешимой с таким расширением.
Напротив, типы семейств не содержат конструкторов значений, поэтому эта проблема там не возникает.