2014-09-07 20 views
8

ho fatto un tipo sinonimo in Haskell:capire un Tipo Tipo di Sinonimo

Prelude> type Foo a = [a] 

Poi, ho controllato il suo tipo:

Prelude> :t [5] :: Foo Integer 
[5] :: Foo Integer :: Foo Integer 

Naturalmente so che Foo a è un tipo sinonimo di [a] da quando l'ho appena scritto

Ma, se stavo consumando una libreria che restituiva Foo Integer, come potrei sapere che cos'è Foo?

Ho provato :t Foo senza successo.

+2

Utilizzare ': kind!' Per valutare le espressioni a livello di testo. –

risposta

16

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.

+5

una * completa * risposta! :) –

Problemi correlati