找出类型同义词的类型

Kev*_*ith 8 haskell

我在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)不是.

  • 一个*彻底的*答案!:) (5认同)