Spróbuj tego: :i Foo
:i
daje informację o związanej symbolem.
:t
podaje typ podpisu dla wyrażeń. (dlatego to nie zadziałało - Foo
nie jest wyrażeniem, jak funkcja lub wartość).
Przykład:
ghci> :i String
type String = [Char] -- Defined in ‘GHC.Base’
A oto informacja premia:
:i
jest również niesamowite dla ADTS, to daje konstruktorów + powiedzieć, które instancje czerpią (od importowanych modułów , oczywiście). Na przykład:
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’
I to również niesamowite dla typu klas, na przykład:
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’
i, jak wspomniano, mogą być również wykorzystywane do funkcji:
ghci> :i id
id :: a -> a -- Defined in ‘GHC.Base’
Jest prawie dokładnie tak, jak :t
, tyle tylko, że powie ci również, w którym module zdefiniowany jest symbol.
Dlaczego więc używać :t
? jest bardziej elastyczny. :i
działa tylko w przypadku symboli związanych. Na przykład. :t (+5)
jest prawidłowe. :i (+5)
nie jest.
Użyj ': kind!' Do oceny wyrażeń poziomu. –