2010-03-13 20 views
9

Podczas pracy z pochodnymi instancjami w Haskell, czy możliwe jest wyprowadzanie funkcji dla dowolnych typów lub czy ograniczamy się do konkretnych funkcji?Wykonywanie dowolnych funkcji w Haskell

+0

Hehe, +1 jeśli znalazłeś to, ponieważ miałeś nadzieję, że możesz wypróbować 'Test.QuickCheck.Arbitrary' dla ADT. :) –

Odpowiedz

9

Można wyprowadzać instancje następujących klas w haskell 98: Eq, Ord, Enum, Ix, Bounded, Read i Show.

Korzystając z rozszerzeń ghc, można także wyprowadzać wystąpienia następujących klas: Możliwe do wpisania, Dane, Funktor, Składane i Traversalable. Istnieje również rozszerzenie ghc, które umożliwia nowemu typowi wyprowadzanie instancji z jego typu implementacji.

Nie można wyprowadzać wystąpień dowolnych klas z tego prostego powodu, że haskell nie wiedziałby, jak wygenerować niezbędne funkcje bez specjalnej wiedzy na temat danej klasy.

+0

Ale GHC poradzi sobie w niektórych prostych przypadkach. Jeśli powiesz 'newtype Bar = Bar Foo' i Foo ma instancję Quux, wtedy GeneralizedNewtypeDeriving może wyprowadzić dla ciebie instancję Quux dla paska. Oczywiście jest to po prostu trywialne rozpakowanie, ale jest lepsze niż nic. – jrockway

6

Ograniczasz się do poszczególnych klas, jeśli chodzi o to, co kompilator wie, jak uzyskać dla Ciebie. Używając preprocesora lub szablonu Haskella, możesz sam zakodować nowe mechanizmy wywodzące, jeśli znasz ogólne podejście do tworzenia implementacji funkcji dla poszczególnych typów.

6

Pozostałe dwie odpowiedzi są poprawne. Ale jeśli potrzebujesz więcej, istnieją pakiety na hackage, które mogą obsłużyć więcej. Bardzo lubię Data.Derive, ponieważ możesz bezpośrednio wygenerować kod źródłowy (dla kompatybilności) lub podłączyć go do Template Haskell, aby zrobić to podczas kompilacji. Szeroka gama klas jest już obsługiwana i bardzo łatwo jest dodać własne wsparcie. Podsumowanie: Boisko reklamowa cholernie dobrym biblioteki :-)

+0

Teraz biorę to z powrotem. W tamtym czasie nie próbowałem dodać wsparcia, ale założyłem, że to łatwe. Nie jest; polega to na rekompilacji biblioteki z tego, co potrafię powiedzieć. Ale nadal wbudowana obsługa jest dobra i kompletna. – luqui

4

Aby dodać odpowiedź Dona: wyprowadzenie funkcji niestandardowych dla typów danych nazywa generic programming i jest lot of literature na ten temat. Preprocesory i szablon Haskell nie są jedynymi rozwiązaniami; zobacz jeden z artykułów przeglądowych, które zawierają listę literatury dla innych opcji.