Ограничение класса типа для экземпляров семейства типов

Можно ли указать ограничение типа класса, которое должно удовлетворяться всеми экземплярами семейства типов?

Например, учитывая следующее объявление, как я могу гарантировать, что все экземпляры также являются экземплярами Eq:

data family Channel c :: *

Большое спасибо,

Майкл

Ответ 1

Это то, что вы ищете?

{-# LANGUAGE FlexibleContexts, TypeFamilies, FlexibleInstances #-}

-- Data family inside a class so that we can add an extra Eq constraint
class Eq (Channel c) => MyClass c where
    data Channel c :: *

-- A simple toy instance
instance MyClass Int where
    data Channel Int = CI Int deriving Eq

-- A more complex instance with separate Eq instance
instance MyClass Char where
    data Channel Char = CC Char

instance Eq (Channel Char) where
   (CC x) == (CC y) = x == y