Functional dependencies vs. type families - różnice w funkcjonowaniu

1

Okazuje się że Type Classes i Multi-parameter type class to dopiero wierzchołek góry lodowej :(
Ale do rzeczy. Chciałbym w Haskellu zamodelować interfejs kolekcji. Mam do wyboru dwa rozwiązania:

Klasyczne, oparte na Functional dependencies:

class Collects e ce | ce -> e where
  empty  :: ce
  insert :: e -> ce -> ce
  member :: e -> ce -> Bool
  toList :: ce -> [e]

Nowsze, oparte na Type families:

class Collects ce where
  type Elem ce
  empty  :: ce
  insert :: Elem ce -> ce -> ce
  member :: Elem ce -> ce -> Bool
  toList :: ce -> [Elem ce]

Czy ktoś wie jakie są różnice funkcjonalności między tymi dwoma rozwiazaniami? Jedyne porównanie jakie znalazłem (na razie) to Functional dependencies vs. type families. Z tego co zrozumiałem to Type Families są szybsze, ale bardziej rozwlekłe w deklaracji

Z góry dziękuję za pomoć

1

Nikt? Nic? Tylko @Saalin podesłał mi http://dev.stephendiehl.com/hask/#type-families do poczytania, gdzie autor pisze o Functional dependencies i Type families, ale nie podaje ewentualnych różnic w działaniu

Na SO Napisali że Type families są preferowane i bardziej intuicyjne. Jakoś tego jeszcze nie czuję :(
Na Redicie znów piszą że Functional dependencies są potężniejsze i więcej sytuacji załatwiają. A że do tworzenia kolekcji wystarczą Type families to powinienem użyć Type Families

Znalazłem odpowiedź na fpcomplete (swoją drogą polecam stronę) :

So, should you use fundeps or type families? Your call. Like many other things in Haskell, there are more than one way to do it. And as you use libraries in the ecosystem, you'll find both used. There are some advantages to both. mtl uses fundeps, both for historical reasons, and arguably because it's slightly easier to work with. Many other use cases are better served with type families. The decision is yours!

1 użytkowników online, w tym zalogowanych: 0, gości: 1