2013-07-17 11 views
9

Zdefiniowałem instancję NumericPreludeRing dla mojego własnego typu danych, ale nie zdefiniowałem one ani fromInteger. Po skompilowaniu programu nie otrzymałem ostrzeżeń, ponieważ klasa Ring ma domyślne wzajemnie rekursywne implementacje dla one i fromInteger. Wynik: przepełnienie stosu, które było bardzo trudne do znalezienia. (W rzeczywistości, przy użyciu -XRebindableSyntax Z fromInteger na stałych numerycznych nie muszą być jawne, więc było dość trudne, aby dowiedzieć się fromInteger był sprawcą przepełnienia stosu.)Minimalne pełne adnotacje definicji dla Haskell

Czy istnieje sposób programistom opisywanie klas do wskazać minimalną kompletną definicję? Byłoby bardzo pomocne, gdyby GHC mógł wysłać ostrzeżenie dla instancji, które nie spełniają tej definicji, jednocześnie zezwalając na kompletny zestaw domyślnych implementacji. Jeśli nie, jaka jest tutaj przyjęta praktyka? Czy programiści powinni pozostawić minimalny zestaw metod (a?) Bez wartości domyślnych, aby wygenerować odpowiednie ostrzeżenia lub czy użytkownicy polegają na RTFM?

Odpowiedz

2

Te dwa podejścia widziałem są w zasadzie:

  1. podać wartości domyślne. Określ minimalną kompletną definicję w dokumentacji (często masz opcje, z wzajemnie rekurencyjnymi wartościami domyślnymi wystarczy wdrożyć wystarczającą ilość metod, aby przerwać rekursję, ale możesz wybrać dowolne). Oczekuj, że twórcy instancji przeczytają dokumentację.

  2. Nie określaj wartości domyślnych, ale udostępniaj funkcje o nazwach takich jak defaultImplementationOfFoo. To w zasadzie zmusza autora instancji do jawnego żądania wartości domyślnych, nie wymagając od nich faktycznej implementacji domyślnej. Ale wciąż muszą przeczytać dokumentację, aby wiedzieć, że te funkcje istnieją.