我在Haskell中创建了一个类型的同义词:
Prelude> type Foo a = [a]
Run Code Online (Sandbox Code Playgroud)
然后,我检查了它的类型:
Prelude> :t [5] :: Foo Integer
[5] :: Foo Integer :: Foo Integer
Run Code Online (Sandbox Code Playgroud)
当然我知道这Foo a
是[a]
我写的那个类型的同义词.
但是,如果我正在消费一个返回的图书馆,Foo Integer
我怎么知道它是什么Foo
?
我尝试:t Foo
没有成功.
Mas*_*tic 16
试试这个: :i Foo
:i
提供有关绑定符号的信息.
:t
为表达式提供类型签名.(这就是为什么它不适合你 - Foo
不是表达式,如函数或值).
例:
ghci> :i String
type String = [Char] -- Defined in ‘GHC.Base’
Run Code Online (Sandbox Code Playgroud)
这里有奖金信息:
:i
对于ADT来说也很棒,它会给你构造函数+告诉你它们派生的实例(当然是从导入的模块).例如:
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’
Run Code Online (Sandbox Code Playgroud)
它对于类型类来说也很棒,例如:
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’
Run Code Online (Sandbox Code Playgroud)
并且,如上所述,也可以用于功能:
ghci> :i id
id :: a -> a -- Defined in ‘GHC.Base’
Run Code Online (Sandbox Code Playgroud)
它几乎就是这样:t
,只是它会告诉你符号定义在哪个模块中.
为什么要使用:t
?它更灵活.:i
仅适用于绑定符号.例如:t (+5)
有效.:i (+5)
不是.