Просмотр определения 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?


person Sibi    schedule 18.08.2013    source источник


Ответы (1)


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

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

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

$ ghc-pkg find-module Data.Maybe
/usr/local/haskell/lib/ghc-7.6.2/package.conf.d
   base-4.6.0.1
   haskell2010-1.1.1.0< br> ~/.ghc/x86_64-linux-7.6.2/package.conf.d

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

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

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

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

person leftaroundabout    schedule 19.08.2013
comment
Довольно просто запустить hoogle на своем компьютере (cabal install; hoogle data). - person aavogt; 19.08.2013
comment
@aavogt: правильно, но поиск из командной строки не даст вам хороших ссылок на пикшу, как онлайн-версия. И использовать его в качестве локального сервера не так просто. - person leftaroundabout; 20.08.2013
comment
Для поиска чего-то вроде data Double и его реализации, скажем, + для соответствия Num, этот метод по-прежнему не дает возможности увидеть исходный код. Пример Maybe в hoogle предлагает ссылку с исходником, но в целом для типов ее нет. - person ely; 18.09.2014