I made a type synonym in Haskell:
Prelude> type Foo a = [a]
Then, I checked its type:
Prelude> :t [5] :: Foo Integer
[5] :: Foo Integer :: Foo Integer
Of course I know that Foo a is a type synonym for [a] since I just wrote it.
But, if I were consuming a library that returned Foo Integer, how would I know what Foo is?
I tried :t Foo without success.
Try this: :i Foo
:i gives information about a bound symbol.:t gives type signature for expressions. (which is why it didn't work for you - Foo is not an expression, like a function or a value is).
Example:
ghci> :i String
type String = [Char] -- Defined in ‘GHC.Base’
And here's bonus information:
:i is also awesome for ADTs, it will give you the constructors + tell you which instances they derive (from the imported modules, of course). For example:
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’
And it's also awesome for type-classes, for example:
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’
And, as mentioned, can also be used for functions:
ghci> :i id
id :: a -> a -- Defined in ‘GHC.Base’
It is almost exactly like :t, only that it will also tell you in what module the symbol is defined.
So why use :t? it's more flexible. :i only works for bound symbols. E.g. :t (+5) is valid. :i (+5) is not.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With