Подтвердить что ты не робот

Посмотрите, какой тип Typeclasses Type является экземпляром в ghci?

Можно ли увидеть, какие типы типов реализует тип? Что-то вроде:

>:typeclasses Int
[Num, etc...]
4b9b3361

Ответ 1

Используйте команду :info.

Prelude> :info Int
data Int = GHC.Types.I# GHC.Prim.Int#   -- Defined in GHC.Types
instance Bounded Int -- Defined in GHC.Enum
instance Enum Int -- Defined in GHC.Enum
instance Eq Int -- Defined in GHC.Base
instance Integral Int -- Defined in GHC.Real
instance Num Int -- Defined in GHC.Num
instance Ord Int -- Defined in GHC.Base
instance Read Int -- Defined in GHC.Read
instance Real Int -- Defined in GHC.Real
instance Show Int -- Defined in GHC.Show

Естественно, этот список зависит от импортируемых модулей.

Prelude> :info (->)
data (->) a b   -- Defined in GHC.Prim
Prelude> :m +Control.Monad.Instances
Prelude Control.Monad.Instances> :info (->)
data (->) a b   -- Defined in GHC.Prim
instance Monad ((->) r) -- Defined in Control.Monad.Instances
instance Functor ((->) r) -- Defined in Control.Monad.Instances

Ответ 2

Попробуйте :info или :i с типом.

Это даст вам как стили классов, так и объявление типа, а также сообщит вам, было ли это определено (что полезно, если вы не помните, какие конструкторы у него есть).

Для типов, которые вы сами определяете, вы даже получаете ссылку на то, где она была определена в Emacs. Это делает его очень удобным для навигации по вашему источнику.

Обратите внимание, что :i очень многоцелевое: вы можете использовать его как для значений, так и для типов. Итак, :i True и :i Bool работают!

*Main> :i Bool
data Bool = False | True    -- Defined in GHC.Bool
instance [overlap ok] Truthy Bool
  -- Defined at /home/tikhon/Documents/blarg2.hs:40:10-20
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
instance Ix Bool -- Defined in GHC.Arr

*Main> :i True
data Bool = ... | True  -- Defined in GHC.Bool   

Это также очень полезно для проверки приоритета операторов:

*Main> :i +
class (Eq a, Show a) => Num a where
  (+) :: a -> a -> a
  ...
      -- Defined in GHC.Num
infixl 6 +