2013-07-24 21 views
6

Haskell's type-defaulting rules wartości domyślne typu zmiennej z ograniczeniami (C1 a, ..., Cn a) jeżeli:uogólnione Typ-zalegających zasady

  • Typem zmiennej pojawia się w żadnych innych ograniczeń
  • Wszystkie klasy Ci są standardowe.
  • Przynajmniej jedna z klas CI jest numeryczny

to sens dla mnie, ale jest to również bardzo ograniczony: w praktyce oznacza to, że zawsze trzeba określić typ gdy jest niejednoznaczna podczas pracy z klasami niestandardowymi. Na przykład, to nie kompiluje:

class (Show a) => MyShow a where 
    myShow :: a -> String 
    myShow = show 

instance (MyShow a) => MyShow (Maybe a) where 
    myShow Nothing = "Nothing" 
    myShow (Just x) = "Just " ++ (myShow x) 

main = print $ myShow Nothing -- ambiguous 

GHCi rozszerza to zestaw zasad w następujący sposób:

  • wszystkich klas CI są zajęcia typu single-parametru.
  • Przynajmniej jedna z klas Ci jest numeryczny, czy Pokaż, równanie lub Ord.

i GHC ma rozszerzenie o nazwie ExtendedDefaultRules które umożliwiają tych zasad. Jednak to rozszerzenie jest bardzo specyficzne: działa tylko w GHC i standardowych klasach. Na przykład można pomyśleć o bibliotekach, które nie korzystają z biblioteki standardowej. W takim przypadku rozszerzenie GHCi nie będzie działać.

Moje pytanie brzmi: jedynym sposobem na rozszerzenie reguł domyślnych Haskella, takich jak GHCi, jest rozszerzenie kompilatora? I bardziej ogólny: czy istnieje sposób definiowania domyślnego typu w oparciu o pewne reguły dotyczące ograniczeń w Haskell 98?

+3

Nie ma sposobu, aby zrobić to, co chcesz. Jeśli możesz wymyślić dobry projekt, wszyscy jesteśmy uszy. Bieżący typ to brodawka. – augustss

+1

Coś jak: 'instancja (MyShow a) => MyShow (Może) gdzie .... zalegających (Int)' . Kompilator może sprawdzić, czy typ jest niejednoznaczny iw tym przypadku domyślny. W powyższym przypadku nic nie byłoby typu Może Int. Oczywiście można domyślnie tylko dla typów, które spełniają ograniczenia. – mariop

+1

@mariop Rozumiem, że jesteś podekscytowany tym pomysłem, ale w tej chwili wydaje się nieco niedopieczony. Jest wiele do przemyślenia, na przykład: Co powinieneś zrobić, jeśli istnieje wiele ograniczeń, które mają różne wartości domyślne? W jaki sposób użytkownicy bibliotek mogą wpływać na domyślne wybory biblioteki, aby lepiej odpowiadać ich potrzebom? Dlaczego instancje są kanonicznym właściwym miejscem do dołączania domyślnych instrukcji? Czy Twoje rozwiązanie może zostać uogólnione na wieloparametrowe klasy typów (oraz fundeps i rodziny typów)? Jestem pewna, że ​​istnieje wiele innych trudnych pytań, które musiałaby spełnić kompletna propozycja. –

Odpowiedz

6

Nie ma sposobu, aby zrobić to, co chcesz.

Obecna sytuacja jest zubożała w fazie projektowania. Pomysł polegał na zrobieniu czegoś minimalnego, które mogłoby zostać przedłużone w przyszłości, gdy mamy dobry projekt.