Prova questo: :i Foo
:i
fornisce informazioni su un simbolo legato.
:t
fornisce la firma del tipo per le espressioni. (che è il motivo per cui non ha funzionato per te - Foo
non è un'espressione, come una funzione o un valore è).
Esempio:
ghci> :i String
type String = [Char] -- Defined in ‘GHC.Base’
Ed ecco le informazioni bonus:
:i
è anche impressionante per ADT, che vi darà i costruttori + dirvi che le istanze derivano (dai moduli importati , ovviamente). Per esempio:
ghci> :i Bool
data Bool = False | True -- Defined in ‘GHC.Types’
instance Bounded Bool -- Defined in ‘GHC.Enum’
instance Enum Bool -- Defined in ‘GHC.Enum’
instance Eq Bool -- Defined in ‘GHC.Classes’
instance Ord Bool -- Defined in ‘GHC.Classes’
instance Read Bool -- Defined in ‘GHC.Read’
instance Show Bool -- Defined in ‘GHC.Show’
Ed è anche impressionante per tipo-classi, ad esempio:
ghci> :i Monad
class Monad (m :: * -> *) where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
-- Defined in ‘GHC.Base’
instance Monad Maybe -- Defined in ‘Data.Maybe’
instance Monad (Either e) -- Defined in ‘Data.Either’
instance Monad [] -- Defined in ‘GHC.Base’
instance Monad IO -- Defined in ‘GHC.Base’
instance Monad ((->) r) -- Defined in ‘GHC.Base’
E, come detto, può essere utilizzato anche per funzioni:
ghci> :i id
id :: a -> a -- Defined in ‘GHC.Base’
E ' quasi esattamente come :t
, solo che ti dirà anche in quale modulo è definito il simbolo.
Quindi perché utilizzare :t
? è più flessibile. :i
funziona solo per i simboli associati. Per esempio. :t (+5)
è valido. :i (+5)
no.
Utilizzare ': kind!' Per valutare le espressioni a livello di testo. –