Просмотр определения Typeclass в ghci для определенного типа

Есть ли способ увидеть определение Typeclass в ghci для определенного типа?

Например, Maybe это определяется следующим образом:

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

Могу ли я увидеть это в ghci?

Когда, я использую :info в ghci, я получаю это:

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'

В приведенном выше представлении я хочу посмотреть, как он определяется в Data.Maybe как пример для Functor. В любом случае, чтобы увидеть это в ghci?

Ответ 1

Нет, это невозможно - не только для случаев, но и для чего угодно. GHC регистрирует только скомпилированную версию пакета, поэтому исходный код вообще не будет доступен для ghci.

Вероятно, чаще всего вы будете использовать материал из Hackage; в этом случае очень просто найти исходный код таких экземпляров, просмотрев модуль, найдя объявление класса или данных и нажав на источник.

Если у вас нет доступа в Интернет или какой-либо другой причины, по которой вы не можете подключиться к Интернету онлайн, сначала вам нужно узнать, в какой пакет включен модуль. Самый простой способ сделать это:

$ ghc-pkg find-module Data.Maybe
/usr/local/haskell/lib/ghc-7.6.2/package.conf.d
база-4.6.0.1
haskell2010-1.1.1.0
~/.ghc/x86_64-линукс-7.6.2/package.conf.d

Затем, как я уже сказал, GHC не знает, где находится исходный код этих пакетов - на самом деле он может быть даже недоступен в вашей системе! Но если вы установили пакет (или тот, который зависит от него) с cabal install, он будет там по умолчанию в ~/.cabal/packages/hackage.haskell.org/PᴀᴄᴋᴀɢᴇNᴀᴍᴇ (как сжатый архив, но это не большой барьер). В папке проекта пакета вы можете просто найти модуль через структуру каталогов, которая представляет иерархию модулей.

Другие пакеты, например, ваш пример Data.Maybe (package haskell2010), возможно, приступили к установке GHC, например платформы Haskell. В этом случае я считаю, что проще всего искать там файл документации Haddock. В моем случае,

$ find/usr/local/haskell -name 'Data-Maybe.html' | глава -n1 | xargs firefox

Это откроет эквивалент того, на что ссылается hoogle (но на вашем локальном HD), где вы также можете просматривать исходный код удобным для пользователя способом.