2014-09-07 13 views
8

Zrobiłem synonim typu w Haskell:Zastanawianie się rodzajem Rodzaj synonim za

Prelude> type Foo a = [a] 

Następnie sprawdziłem jego typ:

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

Oczywiście wiem, że Foo a jest synonimem typu dla [a] ponieważ właśnie to napisałem.

Ale gdybym spożywał bibliotekę, która zwróciła Foo Integer, skąd miałbym wiedzieć, co to jest Foo?

Próbowałem :t Foo bez powodzenia.

+2

Użyj ': kind!' Do oceny wyrażeń poziomu. –

Odpowiedz

16

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.

+5

a * dokładna * odpowiedź! :) –

Powiązane problemy