Все следующие работы:
{-# LANGUAGE TypeFamilies #-}
type family TF a
type instance TF Int = String
type instance TF Bool = Char
data family DF a
data instance DF Int = DFInt String
data instance DF Bool = DFBool Char
type family CTF a where
CTF Int = String
CTF Bool = Char
CTF a = Double -- Overlap OK!
... но это не так (по GHC-8.2):
data family CDF a where
CDF Int = CDFInt String
CDF Bool = CDFBool Char
CDF a = CDFOther Double
wtmpf-file24527.hs:16:19: error: parse error on input ‘where
|
16 | data family CDF a where
| ^^^^^
Неужели никто не потрудился реализовать это, или есть ли какая-то особая причина, по которой было бы нецелесообразно закрывать семейства данных? У меня есть семейство данных, где я бы предпочел сохранить инъективность, но также и возможность сделать непересекающийся экземпляр catch-all. Прямо сейчас, единственный способ, которым я вижу эту работу, - это
newtype CDF' a = CDF' (CTF a)