Можно ли увидеть, какие типы типов реализует тип? Что-то вроде:
>:typeclasses Int
[Num, etc...]
Можно ли увидеть, какие типы типов реализует тип? Что-то вроде:
>:typeclasses Int
[Num, etc...]
Используйте команду :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
Попробуйте :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 +