Właśnie przeczytałem this paper ("Klasy typów: eksploracja przestrzeni projektowej" autorstwa Peytona Jonesa & Jones), co wyjaśnia niektóre problemy związane z wczesnym systemem Haskella i jego ulepszaniem.Dlaczego konieczna jest redukcja kontekstu?
Wiele problemów, które podnoszą, jest związanych z redukcją kontekstu , co jest sposobem na zmniejszenie zestawu ograniczeń w stosunku do deklaracji instancji i funkcji, zgodnie z relacją "odwrotnego powiązania".
np. jeśli masz gdzieś instance (Ord a, Ord b) => Ord (a, b) ...
, wtedy w kontekstach, Ord (a, b)
zostaje zredukowane do {Ord a, Ord b}
(redukcja nie zawsze zmniejsza liczbę ograniczeń).
Nie rozumiałem z artykułu, dlaczego ta redukcja była konieczna.
Cóż, zebrałem, że został użyty do wykonania jakiejś kontroli typu. Kiedy masz zredukowany zestaw ograniczeń, możesz sprawdzić, czy istnieje pewne wystąpienie, które może je spełnić, w przeciwnym razie jest to błąd. Nie jestem zbyt pewny, jaką jest wartość dodaną, ponieważ zauważysz problem na stronie użytkowania, ale w porządku.
Ale nawet jeśli musisz zrobić to sprawdzić, dlaczego użyć wyniku redukcji wewnątrz wywnioskowane typy? Wskazuje na to, że prowadzi to do niezrozumiałych wnioskowych typów.
Artykuł jest dość pradawny (1997), ale o ile wiem, redukcja kontekstu nadal stanowi problem. Specyfikacja Haskell 2010 wspomina zachowanie wnioskowania wyjaśnione powyżej (link).
Dlaczego więc to robi?
Naprawiono! – Norswap