2011-11-09 49 views
6

GHCi中是否有辦法基本獲得狀態轉儲?我的意思是一個列表:GHCi環境轉儲

  • 所有加載的運算符以及它的優先級,關聯性和簽名。
  • 所有加載的類。
  • 所有加載的數據,類型和newtype以及它們是實例的類。
  • 所有已加載的函數及其簽名,以及它們所屬的類。

假設這是可能的,是否也可以在運行時執行此操作,比如在異常期間執行此操作?

回答

4

:browse會給你大部分的這些信息。它顯示

  • 函數和運算符的類型簽名。
  • 類和他們的方法。
  • 數據類型,新類型和類型同義詞,如果它們在作用域中,則使用構造函數。

沒有任何參數,它爲當前加載的模塊顯示此信息。你也可以指定一個不同的模塊。

Prelude> :browse Control.Applicative 
class (Functor f) => Applicative f where 
    pure :: a -> f a 
    (<*>) :: f (a -> b) -> f a -> f b 
    (*>) :: f a -> f b -> f b 
    (<*) :: f a -> f b -> f a 
... 

要查看更多細節,包括優先級和結合爲運營商,以及實例爲一個數據類型,使用:info

Prelude> :info (^) 
(^) :: (Num a, Integral b) => a -> b -> a -- Defined in GHC.Real 
infixr 8^
Prelude> :info Bool 
data Bool = False | True -- Defined in GHC.Bool 
instance Bounded Bool -- Defined in GHC.Enum 
instance Enum Bool -- Defined in GHC.Enum 
instance Eq Bool -- Defined in GHC.Base 
instance Ord Bool -- Defined in GHC.Base 
instance Read Bool -- Defined in GHC.Read 

這些命令在調試時也可用。

欲瞭解更多信息,請鍵入:help或請參閱the GHCi chapter of the GHC user's guide

+0

我想要這樣的整個系統不只是一個模塊。 –

+2

@VansonSamuel:形式爲':browse * Module',它將顯示該模塊範圍內的任何內容的信息,即所有的導入以及導出。也許這更接近你所需要的? – hammar

+0

我會試試這個。謝謝@hammar這就像你幫助我的第四個問題。 :-) –

1

有辦法獲取這些信息。問題是,據我所知,目前還沒有確切的過濾它,你想要的方式方法,但反正這裏是:

  • 如果你想看到的所有標識符,包括類,運營商,目前在ghci中定義的「構造函數」和「類型」只是在光標位於空格時按Tab鍵。

  • 如果你想知道運營商*的優先級和結合只是使用

    :i * 
    
  • 如果你想看到什麼類M是隻使用

    :i M 
    
  • 如果實例你想看到一個功能的簽名f只是用

    :i f 
    

    如果你編寫:set -fbreak-on-exception,那麼ghci將在發生異常時中斷而不會失敗,然後在異常期間可以使用上述所有命令。