2016-04-05 9 views
1

當詢問GHCItypeinfo,哪個名稱空間用於名稱和表達式?GHCI詢問類型或值名稱空間?

:type <expr>    show the type of <expr> 
:info[!] [<name> ...]  display information about the given names 
          (!: do not filter instances) 

我不確定我在問什麼,下面的簽名是什麼意思。

Prelude Control.Monad.State> :t StateT 
StateT :: (s -> m (a, s)) -> StateT s m a 

是從值命名空間第一StateT和第二從類型命名空間中的響應線?

+2

類型簽名的形式表達':: type'的。所有值在'::'的左邊,所有類型都在右邊。 –

回答

6
  • :t [ype]始終使用值命名空間
  • :k [ind]總是使用類型命名空間
  • :i [nfo]同時使用,顯示所有匹配的標識符。例如,

    Prelude> data Q = A 
    Prelude> data A = Q 
    Prelude> :i Q 
    data A = Q -- Defined at <interactive>:5:10 
    
    data Q = A -- Defined at <interactive>:4:1 
    
4

由於只有在詢問表達式類型時纔有意義,因此您可以確信:t StateT正在使用表達式名稱空間。同樣,在類型歸屬/聲明foo :: bar中,左側foo始終是一個表達式,右側bar始終是一個類型。所以就像你說的,在

StateT :: (s -> m (a, s)) -> StateT s m a 

第一StateT是從表達的命名空間,而第二StateT是從類型命名空間。如果要查詢類型級別表達式的「類型」,可以使用:kind命令(或簡稱爲:k),在這種情況下,參數始終爲類型級表達式。因此:

Control.Monad.State> :k StateT 
StateT :: * -> (* -> *) -> * -> * 

這裏::表示歸屬,所以在foo :: barfoo是類型表達和bar是一種電平表達。

通常可以從句法上說明給定名稱來自哪個名稱空間,但:info命令有點特別。當您詢問兩個名稱空間中出現的名稱信息時,它會提供有關兩者的信息。

相關問題