2013-08-18 8 views
9

Czy istnieje sposób, aby zobaczyć definicję Typeclass w ghci dla określonego typu?Widząc definicję Typeclass w ghci dla konkretnego typu

Na przykład Maybe jest zdefiniowany następująco:

instance Functor Maybe where 
    fmap f (Just x) = Just (f x) 
    fmap f Nothing = Nothing 

Mogę zobaczyć w ghci?

Kiedy używam :info w ghci, otrzymuję to:

Prelude> :i Maybe 
data Maybe a = Nothing | Just a  -- Defined in `Data.Maybe' 
instance Eq a => Eq (Maybe a) -- Defined in `Data.Maybe' 
instance Monad Maybe -- Defined in `Data.Maybe' 
instance Functor Maybe -- Defined in `Data.Maybe' 
instance Ord a => Ord (Maybe a) -- Defined in `Data.Maybe' 
instance Read a => Read (Maybe a) -- Defined in `GHC.Read' 
instance Show a => Show (Maybe a) -- Defined in `GHC.Show' 

W powyższym przykładzie, chcę zobaczyć jak to jest zdefiniowane w Data.Maybe jako przykład dla Functor. W każdym razie, aby zobaczyć to w GHC?

Odpowiedz

11

Nie, to nie jest możliwe - nie tylko dla instancji, ale dla wszystkiego. GHC rejestruje tylko skompilowaną wersję pakietu, więc kod źródłowy generalnie nie będzie dostępny dla ghci.

Prawdopodobnie najczęściej będziesz używać rzeczy z Hackage; w takim przypadku bardzo łatwo jest znaleźć kod źródłowy takich instancji przez hoogling the module, lokalizując deklarację klasy lub danych i klikając source.

Kiedy nie masz dostępu do Internetu lub z jakiegokolwiek innego powodu nie możesz hoogle online, najpierw musisz dowiedzieć się, co pakiet moduł jest wliczony w cenę. Najprostszym sposobem, aby to zrobić:

$ ghc-pkg znaleźć moduł Data.Maybe
/usr/local/haskell/lib/ghc-7.6.2/package.conf.d
base-4.6 .0.1
haskell2010-1.1.1.0
~/.ghc/x86_64-linux-7.6.2/package.conf.d

Potem, jak już mówiłem, GHC nie wie, gdzie kod źródłowy do tych pakietów jest zlokalizowana - w rzeczywistości może nawet nie być dostępna w twoim systemie! Ale jeśli zainstalowałeś pakiet (lub taki, który zależy od niego) z cabal install, będzie tam domyślnie w ~/.cabal/packages/hackage.haskell.org/PᴀᴄᴋᴀɢᴇNᴀᴍᴇ (jako skompresowane archiwum, ale to nie jest duża przeszkoda). W folderze projektu pakietu można po prostu zlokalizować moduł za pomocą struktury katalogów, która reprezentuje hierarchię modułów.

Inne pakiety, na przykład Twój przykład Data.Maybe (pakiet haskell2010), mogły być zgodne z Twoją instalacją GHC, np. platforma Haskell. W tym przypadku uważam, że najłatwiej jest znaleźć tam plik dokumentacji Haddock. W moim przypadku,

$ find/usr/local/haskell -name 'Data-Maybe.html' | głowa -n1 | xargs firefox

Otworzy się odpowiednik tego, do czego hoogle cię łączy (ale na twojej lokalnej HD), gdzie możesz również przeglądać kod źródłowy w sposób przyjazny dla użytkownika.

+0

Prowadzenie hoogle na własnej maszynie jest dość proste ('cabal install; hoogle data'). – aavogt

+0

@aavogt: w prawo, ale wyszukiwanie w wierszu poleceń nie da ci dobrych linków do plamiaka, jak wersja online. Używanie go jako lokalnego serwera nie jest tak proste. – leftaroundabout

+1

Aby wyszukać coś takiego jak "dane Double" i jego implementacja, powiedzmy, '+', aby dostosować się do 'Num', ta metoda nadal nie zapewnia sposobu na zobaczenie kodu źródłowego. Przykład 'Maybe' w hoogle oferuje link ze źródłem, ale ogólnie dla typów nie. – ely

Powiązane problemy