2011-12-16 9 views
14

Podczas pracy z plikiem HashMap próbowałem użyć klucza Data.Bson.ObjectId. Odkryłem oczywiście, że nie ma instancji Hashable dla tej struktury. W porządku, bo pisanie jednego jest banalne.Czy mogę dodać deklarację instancji w GHCi

instance Hashable ObjectId where hash (Oid x y) = hash (x,y) 

Wpisałem tę linię do GHCi i powiedziano mi "Błąd składni na wejściu instancji` '". Ma to sens, ponieważ podpowiedź GHCi działa tak, jak gdyby linie były wpisywane do bloku instrukcji do IO, a instancja nie może być zdefiniowana w tym kontekście.

Moje pytanie brzmi: czy istnieje sposób na zdefiniowanie nowej instancji w GHCi?


Dlaczego ta instancja nie jest świadczone przez biblioteki, to inna sprawa. Sądzę, że odpowiedzią było ograniczenie zależności, z tym że pakiet bess już zależy od wszystkiego pod słońcem.

Odpowiedz

14

Dobra wiadomość: Tak, istnieje sposób na zdefiniowanie nowej instancji w GHCi.

Złe wiadomości: W tej chwili pierwszym krokiem jest "zainstalowanie migawki rozwoju GHC".

To była oczywista część brakującej funkcjonalności w GHCi od dłuższego czasu. Nie było nieodłącznego powodu, aby go nie było, ale zakładam, że było to dość trudne do zrealizowania i dlatego zostało odłożone na bok.

Wydaje się jednak, że as of version 7.4.1, it's now available:

Na GHCi poprosi można również wprowadzać żadnych deklaracji Haskell na najwyższym poziomie, w tym dane, typ, newtype, klasy przykład, pochodzący i zagranicznych zgłoszeń. Na przykład:

Prelude> data T = A | B | C deriving (Eq, Ord, Show, Enum) 
Prelude> [A ..] 
[A,B,C] 
Prelude> :i T 
data T = A | B | C  -- Defined at <interactive>:2:6 
instance Enum T -- Defined at <interactive>:2:45 
instance Eq T -- Defined at <interactive>:2:30 
instance Ord T -- Defined at <interactive>:2:34 
instance Show T -- Defined at <interactive>:2:39 

Czy myślisz, że mając teraz warta kłopotów z instalacją wersji non-wydania GHC jest do ciebie.

Powiązane problemy