2016-04-05 17 views
1

type veya info için GHCI veya info için sorulduğunda, adlar ve ifadeler için hangi ad alanı kullanılır?GHCI, tür veya değer adlarını mı soruyor?

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

Ne istediğimi ve aşağıdaki imzanın ne anlama geldiğinden emin değilim.

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

değeri ad alanından StateT birinci ve ikinci tepki hattı tipi ad alanından mı?

+2

Tip imzaları formu 'ifade :: type' vardır. Tüm değerler sol taraftadır: '', tüm türler sağa. –

cevap

6
  • :t [ype] hep
  • :k [ind] hep
  • :i [nfo] Tüm eşleşen tanımlayıcıları gösteren, hem de kullanır tipi ad kullanan değer alan kullanır. Örneğin,

    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

Sadece ifade türlerini sormak mantıklı olduğundan, :t StateT'un ifade ad alanı kullanıyor olduğundan emin olabilirsiniz. Benzer şekilde, foo :: bar türünde bir yazım/bildirim türü, sol taraftaki foo her zaman bir ifadedir ve sağ taraftaki bar her zaman bir türüdür.

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

ilk StateT yılında, dediğin gibi Yani ifade ad alanından, ikincisi StateT tip ad değil. Tür düzeyinde bir ifadenin "türünü" sormak isterseniz, :kind komutunu (veya kısaca :k) kullanabilirsiniz, bu durumda argüman her zaman tip düzeyindeki bir ifadedir. Böylece: Burada ::

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

foo :: bar kadar, foo tipi bir seviyede sentezlenmesi ve bar bir tür düzeyinde ifade, bir tür atıf belirtmektedir.

Genellikle, tamamen sözdizimsel olarak - belirli bir adın hangi ad alanının olduğunu, ancak :info komutunun biraz özel olduğunu söylemek mümkündür. Her iki adda da görünen bir ad hakkında bilgi istediğinizde, her ikisi hakkında da bilgi verir.