Семейства типов не заменяют многопараметрические классы типов, а заменяют функциональные зависимости.
Это потому, что семейства типов позволяют отображать один тип в другой, что аналогично тому, что функциональные зависимости делают с классами многопараметрических типов.Т.е.:
class Collection col e | col -> e where
getHead :: col -> e
instance Collection [a] a where
getHead = head
можно представить с семействами типов как:
class Collection col where
type CollectionHead col :: *
getHead :: col -> CollectionHead col
instance Collection [a] where
type CollectionHead [a] = a
getHead = head
Однако они не могут заменить класс типов с несколькими параметрами без функциональных зависимостей.Например,
class Converter a b where
convert :: a -> b
instance Converter Int String where
convert = show
instance Converter Int [Int] where
convert x = [x]
Невозможно сделать, удалив параметр b и используя семейства типов.Вы можете сделать что-то вроде этого:
class Converter a where
type Target a :: *
convert :: a -> Target a
instance Converter Int where
type Target Int = String
convert = show
Однако написать второй экземпляр невозможно, так как для него требуется дубликат Converter Int
.
Что касается вашей программы, вы можете сразу увидеть, что нет никаких функциональных зависимостей, только несколько классов типов параметров.Поэтому вы не можете выполнить прямое преобразование в семейства типов с этим.