2013-08-18 42 views
9

Có cách nào để xem định nghĩa Typeclass trong ghci cho một loại cụ thể không?Xem định nghĩa Typeclass trong ghci cho một kiểu cụ thể

Ví dụ, Maybe được định nghĩa như thế này:

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

Tôi có thể thấy điều này trong ghci?

Khi, tôi sử dụng :info trong ghci, tôi có được điều này:

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' 

Trong đầu ra ở trên, tôi muốn nhìn thấy nó như thế nào được định nghĩa trong Data.Maybe như một ví dụ cho Functor. Dù sao để thấy điều đó trong ghci?

Trả lời

11

Không, không thể - không chỉ cho các trường hợp mà còn cho bất cứ điều gì. GHC chỉ đăng ký phiên bản đã biên dịch của một gói, vì vậy mã nguồn thường sẽ không có sẵn cho ghci.

Có thể, thông thường bạn sẽ sử dụng nội dung từ Hackage; trong trường hợp đó, rất đơn giản để tìm mã nguồn của các trường hợp như vậy bằng cách hoogling the module, định vị khai báo lớp hoặc dữ liệu và nhấp vào source.

Khi bạn không có quyền truy cập internet hoặc bất kỳ lý do nào khác khiến bạn không thể trực tuyến trên Google, trước tiên bạn cần tìm hiểu xem gói bao gồm mô-đun nào. Cách đơn giản nhất để làm điều đó:

$ GHC-pkg tìm module Data.Maybe
/usr/local/haskell/lib/ghc-7.6.2/package.conf.d
cơ sở-4.6 .0.1
haskell2010-1.1.1.0
~/.ghc/x86_64-linux-7.6.2/package.conf.d

Sau đó, như tôi đã nói, GHC không biết nơi mã nguồn các gói này nằm - thực tế nó thậm chí không có sẵn trên hệ thống của bạn! Nhưng nếu bạn đã cài đặt gói (hoặc một phụ thuộc vào nó) với cabal install, nó sẽ ở đó, theo mặc định trong ~/.cabal/packages/hackage.haskell.org/PᴀᴄᴋᴀɢᴇNᴀᴍᴇ (dưới dạng tệp nén, nhưng đó không phải là một trở ngại lớn). Trong thư mục gói dự án, bạn có thể chỉ định vị trí mô-đun thông qua cấu trúc thư mục, đại diện cho cấu trúc phân cấp mô-đun.

Các gói khác, như ví dụ của bạn về Data.Maybe (gói haskell2010), có thể đã đến ngay với quá trình cài đặt GHC của bạn, ví dụ: nền tảng Haskell. Trong trường hợp đó, tôi tin rằng điều dễ nhất là tìm kiếm ở đó cho tệp tài liệu Haddock. Trong trường hợp của tôi,

$ find/usr/local/haskell -name 'Data-Maybe.html' | đầu -n1 | xargs firefox

Điều đó sẽ mở ra tương đương với những gì hoogle liên kết bạn với (nhưng trên HD địa phương), nơi bạn cũng có thể duyệt mã nguồn theo cách thân thiện với người dùng.

+0

Khá đơn giản để chạy hoogle trên máy của riêng bạn ('cài đặt cabal; dữ liệu hoogle'). – aavogt

+0

@aavogt: đúng, nhưng tìm kiếm dòng lệnh sẽ không cung cấp cho bạn các liên kết tốt đẹp tới mã khóa như phiên bản trực tuyến. Và việc sử dụng nó như một máy chủ cục bộ không đơn giản như vậy. – leftaroundabout

+1

Để tìm kiếm thứ gì đó như 'dữ liệu đôi' và việc thực hiện của nó, giả sử' + 'để phù hợp với' Num', phương pháp này vẫn không cung cấp cách xem mã nguồn. Ví dụ 'Maybe' trong hoogle cung cấp một liên kết với nguồn, nhưng nói chung cho các loại nó thì không. – ely