我在Haskell中做了一个类型同义词:
Prelude> type Foo a = [a]
然后,我检查了它的类型:
Prelude> :t [5] :: Foo Integer
[5] :: Foo Integer :: Foo Integer
当然Foo a
,[a]
因为我刚写过,所以我知道这是类型的同义词。
但是,如果我使用返回的库,Foo Integer
我怎么知道是什么Foo
?
我尝试:t Foo
没有成功。
尝试这个: :i Foo
:i
提供有关绑定符号的信息。
:t
提供表达式的类型签名。(这就是为什么它对您不起作用的原因-Foo
不是表达式,就像函数或值一样)。
例:
ghci> :i String
type String = [Char] -- Defined in ‘GHC.Base’
这是奖金信息:
: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’
而且对于类型类来说也很棒,例如:
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’
并且,如上所述,它还可以用于功能:
ghci> :i id
id :: a -> a -- Defined in ‘GHC.Base’
它几乎完全一样:t
,只是它还会告诉您该符号在哪个模块中定义。
那为什么要使用:t
呢?它更灵活。:i
仅适用于绑定符号。例如:t (+5)
有效。:i (+5)
不是。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句